• C#跨线程调用


    项目上线测试时客户提出表单跳转到指定位置(表单比较长)。当时以为这个就是添加几行代码几分钟的事情,随口答应了。但是到做的时候才发现事情远没有那么简单,测试发现将焦点给指定位置的控件表单可自动滑动到指定位置,但是在事件里面调用控件的Focus方法始终没有任何效果。遂觉得是否控件未初始话无法设置Focus所致,新开一个独立线程等待表单初始化完成时进行跳转。但是又发现“线程间操作无效”,原来是由于Windows安全策略新线程无法操作UI主线程,网上终于找到跨线程操作的示例。依葫芦画瓢,通过跨线程调用,问题终于得到解决。没想到弄这么复杂,本来想很简单的解决问题,如果大家有更简洁的实现方式,欢迎讨论分享。

    Step 1:声明委托

    private delegate void ScrollFormByFocus();

    Step 2:异步代理

        #region ThreadFunction
        private void ThreadFunction()
        {
            if((this[txtSendPubOpinion] as TextBox).InvokeRequired)//等待异步
            {
                ScrollFormByFocus scrollFormByFocus=new ScrollFormByFocus(ThreadFunction);
                this.ContainerForm.Invoke(scrollFormByFocus);//通过代理调用刷新方法
            }
            else
            {
                (this[txtSendPubOpinion] as TextBox).Focus();
            }
        }
        #endregion

    Step 3:调用异步代理

       
        #region CrossThreadFocus
        private void CrossThreadFocus()
        {
            Thread.Sleep(1000);
            try
            {
                ThreadFunction();
            }
            catch(Exception ex)
            {
                logger.Error("分发表单Scrolling遇到问题",ex);
            }
        }
        #endregion

    Step 4:开启线程

        #region 分发跳转
        private void FormJump()
        {
            Thread thread = new Thread(CrossThreadFocus);
            thread.IsBackground = true;
            thread.Name="FormJump";
            thread.Start();
        }
        #endregion

    参考了:http://blog.csdn.net/henreash/article/details/7789566,在此深表谢意。谢谢分享

  • 相关阅读:
    EL表达式 与 servlvet3.0的新规范
    回调函数
    结构体
    指针函数 和 函数指针
    BCC校验(异或和校验)
    stm32 USART串口通信
    stm32 中断
    Systick系统滴答定时器
    stm32f7 时钟
    按键连按和不连按
  • 原文地址:https://www.cnblogs.com/jiangxiaoqiang/p/4237747.html
Copyright © 2020-2023  润新知