Мне нужно вызвать асинхронный метод, реализованный в .NET WPF, из приложения Delphi, использующего COM, и получить результат обратно.Похоже, что Marshalling не поддерживает универсальные типы, поэтому я не могу просто вернуть Task<T>
.Как и ожидалось, вызов Result
в асинхронном методе вызывает тупик.Я решил это с помощью DispatcherFrame
, но это выглядит немного неловко и не является реальным решением "async-ish".
Общая архитектура довольно сложна, поэтому я попытаюсь разбить ее на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;
}
Есть ли лучший способ сделать это?
Спасибо!