Async Delegate - Что такое правильный подход - PullRequest
0 голосов
/ 10 июня 2018

Хорошо, я почти на месте, и мне нужно немного советов, чтобы преодолеть этот горб!Итак, причина, по которой я задал этот вопрос Асинхронный делегат - что такое правильный синтаксис? заключается в том, что я пытаюсь вызвать функцию делегата асинхронно (используя await ...).

Итак,здесь у меня есть класс, который использует библиотеку, которая принимает делегата.Библиотека вызывает делегата при срабатывании.Это выглядит примерно так.

Example.Question.Base{
public static class Consumer{
    private delegate bool Redo();
    private static Redo callbackFunction;

    public static async Task<T> Go(){
        // Do some stuff ...

        // now I want to set up my delegate so this library 
        // I'm using can call back my delgate function when 
        // an event occurs that it manages
        callbackFunction = NonAsync;
        SomeLibrary someLibrary = new SomeLibary();
        await someLibrary.SomeMethod(callbackFunction);
    }

    public static bool NonAsync()
    {
        // Do some work ...
        return false;
    }
}

// so now the callbackFunction is called from 
// the libary when some event occurs.  So that 
// means the actual method "NonAsync()" is called!
} 

Логика в библиотеке, которая вызывает этот delgate, выглядит следующим образом

Example.Question.Library{
public ...{
    public ... SomeMethod(Delegate func){
        func.DynamicInvoke();
    }
}
}

, это прекрасно работает.Мне нужно иметь возможность асинхронно вызывать Делегата из библиотеки.

нужна помощь, чтобы туда добраться

Так что я хочу что-то похожее на это ...

... из библиотеки, которая вызывает делегата ...

public ... SomeMethod(Delegate func){
        await func.DynamicInvoke();
    }

... от потребителя библиотеки, которая определяет делегата ...

Example.Question.Base{
    public static class Consumer{
        // ...

        public static async Task<T> Go(){
            // ...
            callbackFunction = await Async;
            // ...
        }

        public static async Task<bool> Async()
        {
            // Do some work ...
            return await Task.FromResult<bool>(false);
        }
    }
}

Но проблемая получаю сообщение об ошибке компилятора: «Не удается дождаться группы методов»

enter image description here

1 Ответ

0 голосов
/ 10 июня 2018

Просто используйте что-то подобное, например:

public static class Consumer
    {

        public static async Task<T> Go<T>()
        {
            var someLibrary = new SomeLibrary();
            return await someLibrary.SomeMethod(Async<T>);
        }

        public static async Task<T> Async<T>()
        {
            return await Task.FromResult(default(T));
        }
    }

public class SomeLibrary
    {
        public async Task<T> SomeMethod<T>(Func<Task<T>> func)
        {
            return await func.Invoke();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...