我需要函数A来启动更长时间运行的异步方法函数B(包括web服务调用)。
即使函数B尚未返回,函数A也应该返回。
函数B不返回任何数据,即使调用函数A返回,也应该执行
使用.Net 4.5 C#,最好的代码是什么,您能避免任何线程问题吗?
在.net上有很多例子,但要找到有意义的代码并不那么简单。
发布于 2014-12-19 00:27:44
即使函数B尚未返回,函数A也应该返回。
在这种情况下,关键是不应该await对B的调用。
启动更长时间运行的异步方法函数B(包括web服务调用)。
通常,如果大部分操作是web服务调用,则不应该使用Task.Run。Task.Run将在后台线程上执行这项工作,这很可能是不必要的,因为您可以使用异步IO。
相反,创建一个async Task B()方法,在方法中使用普通的await机制,并调用它。默认情况下,这将导致编译器警告,但您可以通过创建一个记录出现异常的FireAndForget扩展方法来解决这个问题。
这可以简单到:
public static async void FireAndForget(this Task task)
{
try
{
await task;
}
catch (Exception e)
{
// Log the exception
}
}这还提供了B()中出现的日志记录问题的好处。
发布于 2014-12-19 00:13:51
最简单的方法是使用Task.Run,它在一个新线程上执行一个操作:
public void A()
{
// Do something...
Task.Run(B);
// or, if you need to pass arguments to B:
// Task.Run(() => B(x, y, z));
// Do something else...
}
public void B()
{
// Do something...
}小心不要从B抛出任何异常,否则会导致进程崩溃。
https://stackoverflow.com/questions/27557939
复制相似问题