我编写了一个函数,该函数将使用相对较新的异步/等待模式在线程上运行任何函数,并稍后通过可选的回调方法通知调用方。该函数非常简单,看起来像这样:
private async void DoOperationAsync<T>(Func<T> operation, Action<T> resultAction = null)
{
if (operation == null)
throw new ArgumentNullException("operation");
var result = await Task<T>.Factory.StartNew(operation);
// Notify someone that this finished
if (resultAction != null)
resultAction(result);
}
这对于返回值的函数非常有效。它对于返回void的函数不起作用(或者也许我不够聪明,无法使其正常工作)。我可以写这种方法的特殊情况,不假定返回类型。但是,我不知道某些C#泛型专家是否可以指出在这种情况下处理void的方法。有没有一种不涉及void函数特殊情况的方法?
我的博客上有一个async
/await
介绍,可能会对您有所帮助。
我编写了一个函数,该函数将使用相对较新的异步/等待模式在线程上运行任何函数,并稍后通过可选的回调方法通知调用方。
那Task.Run
是为了什么
我确实希望该方法在调用线程上运行(就我而言,它将通常是应用程序的主UI线程)。
并且await
已经做到了。
因此,不要像这样编写代码:
DoOperationAsync(() =>
{
// Code that runs on threadpool thread.
return 13;
},
result =>
{
// Code that runs on UI thread.
MessageBox.Show(result.ToString());
});
只是这样做:
var result = await Task.Run(() =>
{
// Code that runs on threadpool thread.
return 13;
});
// Code that runs on UI thread.
MessageBox.Show(result.ToString());
PSTask.Run
已经具有所有必要的重载,以处理带有或不带有返回值的委托。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句