日期:2014-05-17  浏览次数:20839 次

执行处理时程序卡死,能否用异步处理,望指教…
在一个timer控件的Tick事件中:

private void timer1_Tick(object sender, EventArgs e)
{
  var myVar=myMethod();//myMethod方法用于审查信息返回一个值
  if(myVar!=null)
  {
     //下面执行需要的操作
  }
}

现在的问题是myMethod方法在执行逻辑处理的时候会导致程序卡死一段时间,我现在想能不能用异步处理,当myMethod方法执行完毕后 在执行下面的操作,请问这个该怎么实现,或者有没有其他的办法,望指教,谢谢!
------最佳解决方案--------------------
线程下 读写控件属性需要Invoke来实现
this.Invoke((EventHandler)delegate{
//读写属性代码段
});
或者设置Form的CheckForIllegalCrossThreadCalls = false
推荐Invoke
------其他解决方案--------------------
使用线程加委托,
这样界面就不会卡死
------其他解决方案--------------------
全放到线程里即可:

new Thread(() =>
                        {
                            var myVar = myMethod();
                            if (myVar != null)
                            {
                            }
                        }).Start();

------其他解决方案--------------------
用线程执行,可以使得UI不会卡死
------其他解决方案--------------------
使用System.Threading.Timer
------其他解决方案--------------------
引用:
用线程执行,可以使得UI不会卡死

可以详细讲解下吗?您是指把myMethod方法放到线程中执行吗?谢谢…
------其他解决方案--------------------
别用timer,timer不是异步的,将timer中代码放到线程中
------其他解决方案--------------------
引用:
使用System.Threading.Timer

您好,我看了下关于3个timer控件的区别,System.Threading.Timer好象不适用于窗体程序
------其他解决方案--------------------
using System.Threading
------其他解决方案--------------------
引用:
别用timer,timer不是异步的,将timer中代码放到线程中

您好,我曾尝试过将方法体放到线程中执行,但这样后,myMethod方法中对窗体中控件属性的读取就会报错:指定的转换无效,请问这是为什么?
------其他解决方案--------------------
System.Threading.Timer和System.Timers.Timer都不是基于UI线程的
不会卡死界面


------其他解决方案--------------------
引用:
线程下 读写控件属性需要Invoke来实现
this.Invoke((EventHandler)delegate{
//读写属性代码段
});
或者设置Form的CheckForIllegalCrossThreadCalls = false
推荐Invoke

您好,我现在的不足之处是对异步没有较深入的了解,请问可以把这段详细讲解以下么:this.Invoke((EventHandler)delegate{