首页 > 代码库 > C#跨线程调用

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,在此深表谢意。谢谢分享

 

C#跨线程调用