异步委托 - 什么是正确的方法

时间:2018-06-10 08:32:00

标签: c# delegates

好的,所以,我几乎就在那里,只需要一点建议来克服这个驼峰!所以,我问这个questoin Async delegate - What is proper syntax?的原因是因为我试图异步调用委托函数(使用等待...)。

所以,这里有一个类,它使用一个接受委托的库。库在触发时调用委托。它看起来像这样。

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();
    }
}
}

这很好用。我需要的是能够异步地从库中调用Delegate。

需要一些帮助才能到达那里

所以我想要一些看起来像这样的东西......

...来自调用委托的图书馆......

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 :(得分:2)

只需使用类似的东西,例如:

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();
        }
    }
相关问题