使扩展方法异步

9 .net c# asynchronous winforms

有什么方法可以使扩展方法异步?

我现在已经看了一会儿,但还没有发现任何相关内容.会继续看......

Jon*_*eet 13

扩展方法只是一个普通的静态方法,用语法糖来调用它.

因此,弄清楚如何使普通方法异步(例如,通过在.NET 4中启动一个Task)并从那里开始.


Dav*_*man 7

要使任何方法异步,请向方法发送回调并让方法旋转新线程.

我在.net 3.5中掀起了一个简短的样本(也许Jon会向我们展示一个4.0样本):

 public static void Extension<T>(this T self, AsyncCallback callback )
    {
        var state = new State { callback = callback };
        System.Threading.ThreadPool.QueueUserWorkItem(ExtensionCore, callback);
    }

    private static void ExtensionCore(object state)
    {
        // do stuff with OtherStuff
        var complete = new Complete();
        ((State)state).callback(complete);
    }

    private class State
    {
        public AsyncCallback callback { get; set; }
        public object OtherStuff { get; set; }
    }

    public class Complete : IAsyncResult 
    {  
        public object AsyncState
        {
            get { throw new NotImplementedException(); }
        }

        public System.Threading.WaitHandle AsyncWaitHandle
        {
            get { throw new NotImplementedException(); }
        }

        public bool CompletedSynchronously
        {
            get { throw new NotImplementedException(); }
        }

        public bool IsCompleted
        {
            get { throw new NotImplementedException(); }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


abo*_*u00 7

我认为他们正在努力解决这个问题。无论如何,这很容易解决。这是你如何做到的:

假设您尝试在扩展中使用的异步方法如下所示:

public static async Task DoAsynchronousWork(this string doWorkTo)
{
    await AnotherAsyncFunctionAsync(doWorkTo);
    await DoSomeOtherWorkAsync(doWorkTo);
    await DoMoreWorkAsync(doWorkTo);
}
Run Code Online (Sandbox Code Playgroud)

VS 不会对此感到不满,它会编译得很好。但是,如果您尝试调用"MyString".DoAsynchronousWork(),它会抛出一个错误,说它缺少一个字符串参数。所以它并没有完全忽略它是一个扩展的事实,但它仍然需要“this”参数!

幸运的是,很容易解决这个问题。只需替换DoAsynchronousWork为:

public static Task DoAsynchronousWork(this string doWorkTo)
{
    return new Task(async () => {
        await AnotherAsyncFunctionAsync(doWorkTo);
        await DoSomeOtherWorkAsync(doWorkTo);
        await DoMoreWorkAsync(doWorkTo);
    });
}
Run Code Online (Sandbox Code Playgroud)

我希望他们在发布 .NET 4.5 之前解决这个问题,但如果没有,那么至少它很容易解决。(我偶然发现 lambda 表达式可能是异步的,但现在它非常方便!)