BTo*_*TKD 6 .net c# asynchronous task task-parallel-library
背景:
我有一个"信使"课.它发送消息.但是由于限制,我们说它一次只能发送 - 最多 - 5条消息.
我有一个WPF应用程序,它根据需要对消息进行排队,并在继续之前等待处理排队的消息.由于应用程序的异步性质,可以await
在任何给定时间编辑任意数量的消息.
目前的实施:
为此,我Task<Result> SendMessage(Message message)
在我的消息类中实现了一个API.消息传递类的内部是一个自定义的TaskScheduler(来自MSDN的LimitedConcurrencyTaskScheduler),其并发级别设置为5.这样,我希望无论排队多少消息,一次只发送5个,我的客户端应用程序将耐心等待,直到其相应的消息已被处理.
问题:
当我await
的SendMessage
方法,我可以通过调试器看到消息已完成并返回结果,但我的代码永远不会执行await
ed方法调用!
await
在使用不同的TaskScheduler计划的任务时,是否需要进行一些特殊注意事项?
剪切代码:
从我的客户/消费功能:
public async Task Frobulate()
{
Message myMessage = new Message(x, y, z);
await messenger.SendMessage(myMessage);
//Code down here never executes!
}
Run Code Online (Sandbox Code Playgroud)
从我的使者班:
private TaskScheduler _messengerTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(5);
private TaskFactory _messengerTaskFactory = new TaskFactory(_messengerScheduler);
public Task<Result> SendMessage(Message message)
{
//My debugger has verified that "InternalSendMessage" has completed,
//but the caller's continuation appears to never execute
return _messengerTaskFactory.StartNew(() => InternalSendMessage(message));
}
Run Code Online (Sandbox Code Playgroud)
更新:
"冻结"实际上并不是由我的习惯引起的TaskScheduler
; 当我Task
使用默认排队时TaskFactory
,会发生相同的行为!必须在更基础的层面上发生其他事情,可能是由于我自己的愚蠢.