异步任务.NET4.5
我需要一个函数a来启动一个运行时间更长的异步方法函数B(包括web服务调用) 即使函数B尚未返回,函数A也应返回 函数B不返回任何数据,即使在调用函数A时也应该执行 使用.NET4.5C#,最好的代码是什么?您能看到任何线程问题吗异步任务.NET4.5,.net,multithreading,asynchronous,.net,Multithreading,Asynchronous,我需要一个函数a来启动一个运行时间更长的异步方法函数B(包括web服务调用) 即使函数B尚未返回,函数A也应返回 函数B不返回任何数据,即使在调用函数A时也应该执行 使用.NET4.5C#,最好的代码是什么?您能看到任何线程问题吗 在.net上有很多示例,但要找到所需的代码并不是那么简单。最简单的方法是使用Task.Run,它在新线程上执行操作: public void A() { // Do something... Task.Run(B); // or, if yo
在.net上有很多示例,但要找到所需的代码并不是那么简单。最简单的方法是使用
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抛出,否则它将使进程崩溃
即使函数B尚未返回,函数A也应返回
在这种情况下,关键是您不应该等待调用B
启动运行时间较长的异步方法函数B(包括web服务调用)
通常,如果大部分操作是web服务调用,则不应使用Task.Run
。Run将在后台线程上执行工作,这可能不是必需的,因为您可以使用异步IO
相反,将您的方法创建为异步任务B()
,在方法中使用正常的等待
机制,并调用它。默认情况下,这将导致编译器警告,但您可以通过创建FireAndForget
扩展方法来解决此问题,该方法记录发生的异常
这可以简单到:
public static async void FireAndForget(this Task task)
{
try
{
await task;
}
catch (Exception e)
{
// Log the exception
}
}
这还提供了在
B()
中发生的日志记录问题的好处,非常简单!即使A在B完成之前返回,这也应该有效吗?@SteveWard,是的<代码>任务.Run立即返回,而B继续在单独的线程上运行。我认为这不一定是一个好的实践,特别是因为OP指出他们正在使用web服务调用(异步IO)…@ReedCopsey,这取决于B是如何实现的;如果它使用异步调用,在新线程上运行它没有任何好处,但是如果它只进行同步调用,将工作转移到新线程将防止冻结UI。实际上,对web服务的异步调用并不保证它不会阻塞,因为有些操作是在.NET的HTTP堆栈中同步完成的(例如DNS解析)能够登录的好处是一个很大的好处!Reed,我正在使用你的扩展方法,但它只是挂在等待任务上。我是否按预期使用它?var t=新任务(()=>DoStuff()t.FireAndForget();@STeveWard一般来说,使用任务。运行而不是新任务-那么你就不需要调用start了