后台工作线程和异步调用

时间:2020-05-07 20:15:32

标签: c# multithreading async-await

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

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

1 个答案:

答案 0 :(得分:2)

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

await具有“钩子”,可用于控制默认的恢复行为。 await本身(如果一直使用)将“屈服”回到您的消息处理循环;那没问题。但是默认情况下,await恢复执行其方法时,该方法将在线程池线程上运行,而不是在专用后台线程上运行。

如果您希望在await之后的代码在后台线程中恢复,则需要创建一个SynchronizationContext来将工作排队到后台线程的队列中,并确保将其设置为当前线程SynchronizationContext用于在后台线程上运行的任何代码。我写了一个AsyncContextThread,它是一个带有消息队列和SynchronizationContext的后台线程;那应该是一个很好的起点。

相关问题