Как вызвать асинхронный метод .NET из COM неблокирующим способом? - PullRequest
0 голосов
/ 28 января 2019

Мне нужно вызвать асинхронный метод, реализованный в .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;
}

Есть ли лучший способ сделать это?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...