后台工作线程和异步调用
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中做这样的事情:))
以上是关于后台工作线程和异步调用的主要内容,如果未能解决你的问题,请参考以下文章