Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使专有的同步web服务api可用于异步使用(异步/等待)?_C#_Async Await_Exchange Server_Exchangewebservices - Fatal编程技术网

C# 如何使专有的同步web服务api可用于异步使用(异步/等待)?

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

具体问题: 如何使专有的同步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的假设是错误的,那么这只会提高吞吐量

数据流解决方案可能如下所示:

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是同步的,则根据定义,它必须在等待和读取下一封邮件时阻止线程