首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步任务.Net 4.5

异步任务.Net 4.5
EN

Stack Overflow用户
提问于 2014-12-19 00:10:47
回答 2查看 239关注 0票数 0

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

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

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

使用.Net 4.5 C#,最好的代码是什么,您能避免任何线程问题吗?

在.net上有很多例子,但要找到有意义的代码并不那么简单。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-19 00:27:44

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

在这种情况下,关键是不应该awaitB的调用。

启动更长时间运行的异步方法函数B(包括web服务调用)。

通常,如果大部分操作是web服务调用,则不应该使用Task.Run。Task.Run将在后台线程上执行这项工作,这很可能是不必要的,因为您可以使用异步IO。

相反,创建一个async Task B()方法,在方法中使用普通的await机制,并调用它。默认情况下,这将导致编译器警告,但您可以通过创建一个记录出现异常的FireAndForget扩展方法来解决这个问题。

这可以简单到:

代码语言:javascript
复制
public static async void FireAndForget(this Task task)
{
    try
    {
        await task;
    }
    catch (Exception e)
    {
        // Log the exception
    }
}

这还提供了B()中出现的日志记录问题的好处。

票数 1
EN

Stack Overflow用户

发布于 2014-12-19 00:13:51

最简单的方法是使用Task.Run,它在一个新线程上执行一个操作:

代码语言:javascript
复制
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抛出任何异常,否则会导致进程崩溃。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27557939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档