【发布时间】:2018-12-27 09:21:36
【问题描述】:
我正在开发 WCF 服务/客户端,试图找出如何用不会阻塞调用者线程的东西替换 ManualResetEvent。
最重要的是 await client.CloseAsync() 在FinishedEventReceived 事件被触发之前不会被调用。
我曾考虑使用 TaskCompletionSource,但我有点不确定在这种情况下它会如何工作。
我知道代码有点丑陋,完全违背了使用异步编程的目的,我的道歉。
有什么想法吗?
private async Task CallServiceMethodAndWaitForEvent()
{
var mre = new ManualResetEvent(true);
var client = new AwesomeClient();
client.FinishedEventReceived += (s, e) =>
{
// Do something with the result, this event is only fired once.
mre.Set();
};
client.UpdateEventReceived += (s, e) =>
{
// This even can fire several times before the finished event.
};
try
{
var parameters = new Parameters()
{
SomeParameter = "Test123",
TestAmount = 10000,
};
var errors = await client.DoWorkAsync(parameters);
Debug.WriteLine(errors);
mre.WaitOne(TimeSpan.FromSeconds(20));
await client.CloseAsync();
}
catch (FaultException ex)
{
}
catch (Exception)
{
client.Abort();
}
}
【问题讨论】:
-
“我知道代码有点丑,完全违背了使用异步编程的目的,我的道歉。” - 实际上,我认为它根本没有(好吧,除了阻止
WaitOne,但这大概就是你要在这里解决的问题)
标签: c# wcf asynchronous taskcompletionsource