我正在使用这样的代码:
handler.Invoke(sender, e);
但该代码的问题在于它是同步的,它真正做的就是更新GUI。服务器没有必要等待它完成,因此它应该是异步的。
我真的不想使用BeginInvoke和EndInvoke,因为在这种情况下不需要回调方法。
这是一个合适的选择吗?
Task.Factory.StartNew(() => handler.Invoke(sender, e));
答案 0 :(得分:0)
你这样做的方式很好,另一种在.NET 3.5上运行的方法是使用ThreadPool
类而不是
ThreadPool.QueueUserWorkItem(new WaitCallback((a) => handler.Invoke(sender, e)))
此外,如果处理程序恰好是从控件派生的,you are allowed to call BeginInvoke without a corresponding EndInvoke.
答案 1 :(得分:0)
对GUI的调用非常特殊,因为它们必须始终从GUI线程完成。用你自己的话说,handler.Invoke(sender, e)
“更新GUI”,但它(可能)不是从GUI线程执行的,所以它的当前形式不行。
在WinForms中,您需要将任务委托包装到Control.Invoke
(或忘记任务,只使用Control.BeginInvoke
)。
如果是WPF,您可以将任务委托包装到Dispatcher.Invoke
(或者在没有任务的情况下使用Dispatcher.BeginInvoke
)。
答案 2 :(得分:-1)
我不熟悉C#4的Task类,但我知道没有EndInvoke,BeginInvoke工作得很好。我有时写这样的代码:
handler.BeginInvoke(sender, e, null, null);
编辑:我错了。虽然不需要EndInvoke来使代码在新线程上执行,但文档明确指出EndInvoke很重要。