Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步任务.NET4.5_.net_Multithreading_Asynchronous - Fatal编程技术网

异步任务.NET4.5

异步任务.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

我需要一个函数a来启动一个运行时间更长的异步方法函数B(包括web服务调用)

即使函数B尚未返回,函数A也应返回

函数B不返回任何数据,即使在调用函数A时也应该执行

使用.NET4.5C#,最好的代码是什么?您能看到任何线程问题吗


在.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了