代码之家  ›  专栏  ›  技术社区  ›  Robert Green MBA

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

  •  0
  • Robert Green MBA  · 技术社区  · 6 年前

    好吧,那么,我就快到了,只需要一点建议就可以越过这个驼峰了!所以,我问这个问题的原因是 异步委托-什么是正确的语法?是因为我正试图异步调用委托函数(使用await…)。

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

    example.question.base{
    公共静态类使用者{
    私有委托bool redo();
    私有静态重做回调函数;
    
    公共静态异步任务<t>go()。{
    //做些事情…
    
    //现在我要设置我的委托,以便此库
    //我正在使用的can回调delgate函数
    //发生它管理的事件
    回调函数=非同步;
    somelibrary somelibrary=new somelibary();
    等待somelibrary.somemethod(回调函数);
    }
    
    公共静态bool nonasync()
    {
    //做点工作…
    返回false;
    }
    }
    
    //现在调用回调函数是从
    //发生某些事件时的libary。以便
    //表示实际调用方法“nonasync()”!
    }
    
    
    

    库中调用此Delgate的逻辑如下

    example.question.library{
    公开…。{
    公开…somemethod(委托func){
    func.dynamicinvoke();
    }
    }
    }
    
    
    

    这个很好用。我需要的是能够从库异步调用委托。

    去那里需要帮助

    所以我想要看起来像这样的东西…

    …从调用委托的库中…

    public…somemethod(委托func){
    等待func.dynamicinvoke();
    }
    
    
    

    ……来自定义委托的库的使用者…

    example.question.base{
    公共静态类使用者{
    /…
    
    公共静态异步任务<t>go()。{
    /…
    callbackFunction=等待异步;
    /…
    }
    
    公共静态异步任务<bool>async()
    {
    //做点工作…
    返回wait task.fromresult<bool>(false);
    }
    }
    }
    
    
    

    但问题是我得到一个编译器错误,说“不能等待”方法组。

    .因为我正试图异步调用委托函数(使用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);
            }
        }
    }
    

    但问题是我得到一个编译器错误,说“不能等待”方法组。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Lukasz Ożóg    6 年前

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