这是异步调用同步方法的正确方法吗?

时间:2011-10-01 23:11:04

标签: c# asynchronous task invoke

我正在使用这样的代码:

handler.Invoke(sender, e);

但该代码的问题在于它是同步的,它真正做的就是更新GUI。服务器没有必要等待它完成,因此它应该是异步的。

我真的不想使用BeginInvoke和EndInvoke,因为在这种情况下不需要回调方法。

这是一个合适的选择吗?

Task.Factory.StartNew(() => handler.Invoke(sender, e));

3 个答案:

答案 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很重要。