如何以非阻塞方式从COM调用异步.NET方法?

时间:2019-01-28 10:47:55

标签: c# wpf async-await

我必须使用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;
}

还有更好的方法吗?

谢谢!

0 个答案:

没有答案