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

  • 相关阅读:
    整理诗稿有感
    穿越校园有感
    晚饭后独自散步有感
    漫步锦里有感
    世界经理人: 三个重要法则让你彻底改变!
    看艺人名字作诗有感
    如果你不想成为默默无闻的人,那么规划生涯
    技术人员PK管理人员的博弈论
    英雄气概
    与君相识天涯有感
  • 原文地址:https://www.cnblogs.com/jiangxiaoqiang/p/4237747.html
Copyright © 2011-2022 走看看