C# 使扩展方法异步

C# 使扩展方法异步,c#,.net,winforms,asynchronous,C#,.net,Winforms,Asynchronous,有什么方法可以使扩展方法异步吗 我已经四处寻找了一段时间,但还没有找到任何相关的东西。将继续查看…以使任何方法异步,并向该方法发送回调并使该方法旋转一个新线程 我在.NET3.5中创建了一个简短的示例(也许Jon会给我们展示一个4.0的示例): publicstaticvoid扩展(这个是T-self,异步回调) { var state=newstate{callback=callback}; System.Threading.ThreadPool.QueueUserWorkItem(Exten

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


我已经四处寻找了一段时间,但还没有找到任何相关的东西。将继续查看…

以使任何方法异步,并向该方法发送回调并使该方法旋转一个新线程

我在.NET3.5中创建了一个简短的示例(也许Jon会给我们展示一个4.0的示例):

publicstaticvoid扩展(这个是T-self,异步回调)
{
var state=newstate{callback=callback};
System.Threading.ThreadPool.QueueUserWorkItem(ExtensionCore,回调);
}
专用静态void ExtensionCore(对象状态)
{
//用其他东西做事
var complete=新的complete();
((状态)State).回调(完成);
}
私有阶级国家
{
公共异步回调{get;set;}
公共对象OtherStuff{get;set;}
}
公共类完成:IAsyncResult
{  
公共对象异步状态
{
获取{抛出新的NotImplementedException();}
}
public System.Threading.WaitHandle异步WaitHandle
{
获取{抛出新的NotImplementedException();}
}
公共布尔同步完成
{
获取{抛出新的NotImplementedException();}
}
公共图书馆完工了
{
获取{抛出新的NotImplementedException();}
}
}
}

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


因此,请确定如何使普通方法异步(例如,通过在.NET 4中启动其中的任务)并从中开始。

在一个相关的注释中,提供了有助于异步编程的扩展方法。NET 4还具有(Jon提到的)功能,可以帮助并行化集合上的常见操作,并且通常可以大大简化异常传播(甚至跨多个任务聚合异常)、多个并行任务之间的协调(必须组合它们的结果),支持取消和其他复杂的行为。

我认为他们正在努力解决这个问题。不管怎么说,工作很容易。以下是您的操作方法:

假设您尝试将异步方法转换为扩展,如下所示:

public static async Task DoAsynchronousWork(this string doWorkTo)
{
    await AnotherAsyncFunctionAsync(doWorkTo);
    await DoSomeOtherWorkAsync(doWorkTo);
    await DoMoreWorkAsync(doWorkTo);
}
VS不会对此大发雷霆,它会编译得很好。但是,如果尝试调用
“MyString”.DoAsynchronousWork()
,它将抛出一个错误,表示缺少字符串参数。所以它并没有完全忽略它是一个扩展的事实,但它仍然需要“this”参数

幸运的是,这很容易解决。只需将
doacynchronouswork
替换为以下内容:

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

我希望他们在发布.NET4.5之前能解决这个问题,但如果不能,那么至少很容易解决这个问题。(我偶然发现lambdas可以异步,但现在它非常方便!)

异步方法是什么意思?谢谢@overyou00提供了一个有价值的答案。向上投票:-)这只是其他研究人员的一个快速更新;“他们”确实及时修复了.NET4.5中的此缺陷,例如,请参见类中的异步扩展方法。
public static Task DoAsynchronousWork(this string doWorkTo)
{
    return new Task(async () => {
        await AnotherAsyncFunctionAsync(doWorkTo);
        await DoSomeOtherWorkAsync(doWorkTo);
        await DoMoreWorkAsync(doWorkTo);
    });
}