后台工作线程和异步调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后台工作线程和异步调用相关的知识,希望对你有一定的参考价值。

我正在使用C#应用程序,它有一个后台线程,可以处理很多任务,例如调用HTTP / REST端点,进行基本计算,通过套接字发送数据等。所有操作都排队到后台线程,它分别使它们出队,进行处理,然后进行下一个。

我一直在考虑在后台线程中使用异步,例如使用async / await语义调用HTTP端点,但是不确定这将如何影响后台线程。让我们说,后台线程使用异步调用HTTP终结点,如何构造代码,以使下一个数据包出队并对其进行处理?

答案

您可以混合异步/等待和在后台线程上运行。异步/等待不会以任何方式“影响”后台线程。但是请记住,在异步/等待下涉及任务(和状态机)。

有趣的事实是,当您反编译异步/等待代码->时,那里没有异步/等待;)您可以说这是一个语法suger。

有关其组织方式的更多信息-例如,在这里:https://ranjeet.dev/understanding-how-async-state-machine-works/

所以可能会发生,当您从异步操作返回时(例如,您将开始从HTTP请求接收响应)-可能您将终止于另一个线程,而其余代码将在一个线程上进行处理。不同的线程。通常,这不是问题,但有时确实会有所作为(例如,在ASP.NET上-httpcontext可能因此而丢失)

您确实也问过“我如何构造代码”,这就是异步/等待的美妙之处。您不需要:)要做的就是将所有内容都更改为async / await-因为规则:“一路异步”非常重要。有关异步编程的重要规则,请参见此处:https://docs.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming

例如,如果您确实有这样的代码:

public string SendHttpRequest()
{
    using (var client = new WebClient())
    {
        return client.DownloadString(new Uri("http://www.example.com/example.aspx"));
    }
}

您只需要将其更改为:

public async Task<string> SendHttpRequestAsync()
{
    using (var client = new WebClient())
    {
        return await client.DownloadStringTaskAsync("http://www.example.com/example.aspx");
    }
}

然后,当然,代码中的每个位置都必须更改为异步(并且必须调用此方法以及所有将在等待状态下变为异步的方法)。这就是“一直异步”的规则试图在代码中的某处使用它:

SendHttpRequestAsync().Result --> beacause it saves you from adding async on the method;)

然后,您错过了使用异步和真正的床的地步,事情可能会发生(尝试通过OnClick事件在Winforms中做这样的事情:))

以上是关于后台工作线程和异步调用的主要内容,如果未能解决你的问题,请参考以下文章

在后台线程上执行异步套接字

异步任务片段背景数据

如何在Android开发中用AsyncTask异步更新UI界面

Flask 的异步调用方法

Firebase ios sdk 异步和线程

java队列实现异步执行