我必须使用COM从Delphi应用程序中调用.NET WPF中实现的异步方法,并将结果返回。编组似乎不支持通用类型,因此我不能简单地返回Task<T>
。不出所料,在异步方法上调用Result
会导致死锁。我使用DispatcherFrame
解决了这个问题,但是感觉有点尴尬,不是真正的“异步”解决方案。
总体架构非常复杂,因此我将尝试将其分解为SSCCE:
public IMyResult DoSomethingViaComAsync(string myValue)
{
return InnerCallAsync(myValue).Result;
}
private async Task<IMyResult> InnerCallAsync(string myValue)
{
Exception e = null;
var frame = new DispatcherFrame();
var s = Dispatcher.CurrentDispatcher.InvokeAsync(async () =>
{
var result = await TheEssentialMethodAsync(myValue);
frame.Continue = false;
return result;
});
Dispatcher.PushFrame(frame);
if (e != null)
{
throw e;
}
return s.Result;
}
还有更好的方法吗?
谢谢!