C# 如何使专有的同步web服务api可用于异步使用(异步/等待)?
具体问题: 如何使专有的同步web服务api可用于异步使用(异步/等待) 背景: 我目前正在迁移.NET Windows服务以使用异步/await模式。该服务通过使用Exchange Web服务管理的API对Microsoft Exchange Server进行大量轮询,以便提取和自动处理某些邮件。由于邮件数量正在快速增长(大约每天10万封),我被要求提高它的吞吐量。由于等待时间基本上与IO有关,而与CPU无关,因此我认为使用async/wait和wait调用来交换是有益的。目前,EWS管理的API只提供一些异步操作(即所有与文件夹或电子邮件相关的操作都是同步的) 非常感谢 具体问题:如何异步调用同步API 问题不对,IMO。异步调用同步API根本无助于吞吐量。在这种情况下,它实际上会导致一些不必要的开销,(非常)略微降低吞吐量 我仍然希望它是一个单线程应用程序。在调用exchange时,应用程序能够处理一些进一步的工作,即访问下一个邮箱以从中提取邮件 你不能两全其美。如果Exchange API是同步的,则根据定义,它必须在等待和读取下一封邮件时阻止线程 听起来您可能会从使用TPL数据流中受益,因此您可以让主线程从Exchange读取数据并发布到数据流块,并允许该块在后台线程上处理消息。如果您关于花费大部分时间阅读Exchange的假设是错误的,那么这只会提高吞吐量 数据流解决方案可能如下所示:C# 如何使专有的同步web服务api可用于异步使用(异步/等待)?,c#,async-await,exchange-server,exchangewebservices,C#,Async Await,Exchange Server,Exchangewebservices,具体问题: 如何使专有的同步web服务api可用于异步使用(异步/等待) 背景: 我目前正在迁移.NET Windows服务以使用异步/await模式。该服务通过使用Exchange Web服务管理的API对Microsoft Exchange Server进行大量轮询,以便提取和自动处理某些邮件。由于邮件数量正在快速增长(大约每天10万封),我被要求提高它的吞吐量。由于等待时间基本上与IO有关,而与CPU无关,因此我认为使用async/wait和wait调用来交换是有益的。目前,EWS管理的A
ActionBlock<string> _block;
void MainLoop()
{
_block = new ActionBlock<string>(ProcessMessage);
while (true)
{
var message = ReadFromExchange();
_block.Post(message);
}
}
void ProcessMessage(string message)
{
...
}
ActionBlock\u块;
void MainLoop()
{
_block=新操作块(ProcessMessage);
while(true)
{
var message=ReadFromExchange();
_block.Post(消息);
}
}
void ProcessMessage(字符串消息)
{
...
}
请注意,如果ReadFromExchange
通常比ProcessMessage
快,则这种稍后处理方法的队列可能会被淹没
具体问题:如何异步调用同步API
问题不对,IMO。异步调用同步API根本无助于吞吐量。在这种情况下,它实际上会导致一些不必要的开销,(非常)略微降低吞吐量
我仍然希望它是一个单线程应用程序。在调用exchange时,应用程序能够处理一些进一步的工作,即访问下一个邮箱以从中提取邮件
你不能两全其美。如果Exchange API是同步的,则根据定义,它必须在等待和读取下一封邮件时阻止线程
听起来您可能会从使用TPL数据流中受益,因此您可以让主线程从Exchange读取数据并发布到数据流块,并允许该块在后台线程上处理消息。如果您关于花费大部分时间阅读Exchange的假设是错误的,那么这只会提高吞吐量
数据流解决方案可能如下所示:
ActionBlock<string> _block;
void MainLoop()
{
_block = new ActionBlock<string>(ProcessMessage);
while (true)
{
var message = ReadFromExchange();
_block.Post(message);
}
}
void ProcessMessage(string message)
{
...
}
ActionBlock\u块;
void MainLoop()
{
_block=新操作块(ProcessMessage);
while(true)
{
var message=ReadFromExchange();
_block.Post(消息);
}
}
void ProcessMessage(字符串消息)
{
...
}
请注意,如果ReadFromExchange
通常比ProcessMessage
快,则这种稍后处理方法的队列可能会被淹没
具体问题:如何异步调用同步API
问题不对,IMO。异步调用同步API根本无助于吞吐量。在这种情况下,它实际上会导致一些不必要的开销,(非常)略微降低吞吐量
我仍然希望它是一个单线程应用程序。在调用exchange时,应用程序能够处理一些进一步的工作,即访问下一个邮箱以从中提取邮件
你不能两全其美。如果Exchange API是同步的,则根据定义,它必须在等待和读取下一封邮件时阻止线程
听起来您可能会从使用TPL数据流中受益,因此您可以让主线程从Exchange读取数据并发布到数据流块,并允许该块在后台线程上处理消息。如果您关于花费大部分时间阅读Exchange的假设是错误的,那么这只会提高吞吐量
数据流解决方案可能如下所示:
ActionBlock<string> _block;
void MainLoop()
{
_block = new ActionBlock<string>(ProcessMessage);
while (true)
{
var message = ReadFromExchange();
_block.Post(message);
}
}
void ProcessMessage(string message)
{
...
}
ActionBlock\u块;
void MainLoop()
{
_block=新操作块(ProcessMessage);
while(true)
{
var message=ReadFromExchange();
_block.Post(消息);
}
}
void ProcessMessage(字符串消息)
{
...
}
请注意,如果ReadFromExchange
通常比ProcessMessage
快,则这种稍后处理方法的队列可能会被淹没
具体问题:如何异步调用同步API
问题不对,IMO。异步调用同步API根本无助于吞吐量。在这种情况下,它实际上会导致一些不必要的开销,(非常)略微降低吞吐量
我仍然希望它是一个单线程应用程序。在调用exchange时,应用程序能够处理一些进一步的工作,即访问下一个邮箱以从中提取邮件
你不能两全其美。如果Exchange API是同步的,则根据定义,它必须在等待和读取下一封邮件时阻止线程