要使任何方法异步,请向方法发送回调并让方法旋转新线程.
我在.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)
我认为他们正在努力解决这个问题。无论如何,这很容易解决。这是你如何做到的:
假设您尝试在扩展中使用的异步方法如下所示:
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 表达式可能是异步的,但现在它非常方便!)
| 归档时间: |
|
| 查看次数: |
6690 次 |
| 最近记录: |