zoukankan      html  css  js  c++  java
  • 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,在此深表谢意。谢谢分享

  • 相关阅读:
    BZOJ 1040 (ZJOI 2008) 骑士
    BZOJ 1037 (ZJOI 2008) 生日聚会
    ZJOI 2006 物流运输 bzoj1003
    ZJOI 2006 物流运输 bzoj1003
    NOI2001 炮兵阵地 洛谷2704
    NOI2001 炮兵阵地 洛谷2704
    JLOI 2013 卡牌游戏 bzoj3191
    JLOI 2013 卡牌游戏 bzoj3191
    Noip 2012 day2t1 同余方程
    bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
  • 原文地址:https://www.cnblogs.com/jiangxiaoqiang/p/4237747.html
Copyright © 2011-2022 走看看