在一个timer控件的Tick事件中:private void timer1_Tick(object sender, EventArgs e)
{
  var myVar=myMethod();//myMethod方法用于审查信息返回一个值
  if(myVar!=null)
  {
     //下面执行需要的操作
  }
}现在的问题是myMethod方法在执行逻辑处理的时候会导致程序卡死一段时间,我现在想能不能用异步处理,当myMethod方法执行完毕后 在执行下面的操作,请问这个该怎么实现,或者有没有其他的办法,望指教,谢谢!

解决方案 »

  1.   

    可以详细讲解下吗?您是指把myMethod方法放到线程中执行吗?谢谢…
      

  2.   

    别用timer,timer不是异步的,将timer中代码放到线程中
      

  3.   

    您好,我看了下关于3个timer控件的区别,System.Threading.Timer好象不适用于窗体程序
      

  4.   

    您好,我曾尝试过将方法体放到线程中执行,但这样后,myMethod方法中对窗体中控件属性的读取就会报错:指定的转换无效,请问这是为什么?
      

  5.   

    System.Threading.Timer和System.Timers.Timer都不是基于UI线程的
    不会卡死界面
      

  6.   

    线程下 读写控件属性需要Invoke来实现
    this.Invoke((EventHandler)delegate{
    //读写属性代码段
    });
    或者设置Form的CheckForIllegalCrossThreadCalls = false
    推荐Invoke
      

  7.   

    您好,我现在的不足之处是对异步没有较深入的了解,请问可以把这段详细讲解以下么:this.Invoke((EventHandler)delegate{
    //读写属性代码段
    });
    谢谢……
      

  8.   

    this.Invoke((EventHandler)delegate{
    string s = txtItem.Text;
    txtItem.Text = s;
    });
      

  9.   

    this.Invoke 实际还是在UI线程读写控件属性
      

  10.   

    .net默认非UI线程不能操作UI线程内的控件
    读写都不行
    this.Invoke实际是以EventHandler的方式注入到UI线程
    类似于UI层的事件响应
      

  11.   

    使用线程,如果要在线程中操作控件的话用Invoke
      

  12.   

    全放到线程里即可:new Thread(() =>
                            {
                                var myVar = myMethod();
                                if (myVar != null)
                                {
                                }
                            }).Start();