Bri*_*ler 16 .net c# asynchronous task task-parallel-library
.NET 4.0有TPL,它包含很好的Task类来封装异步编程模型.我正在开发一个必须是.NET 2.0的应用程序,但我想避免重写Task.有什么建议?
Sea*_*man 13
我知道你说你不想重写Task,但实际上你可以使用闭包创建一些相当简单的东西,它的行为有点像Task对象.这是我使用的:
public delegate R AsyncTask<R>();
public static AsyncTask<R> BeginTask<R>(AsyncTask<R> function)
{
R retv = default(R);
bool completed = false;
object sync = new object();
IAsyncResult asyncResult = function.BeginInvoke(
iAsyncResult =>
{
lock (sync)
{
completed = true;
retv = function.EndInvoke(iAsyncResult);
Monitor.Pulse(sync);
}
}, null);
return delegate
{
lock (sync)
{
if (!completed)
{
Monitor.Wait(sync);
}
return retv;
}
};
}
Run Code Online (Sandbox Code Playgroud)
它是一个函数,它在你传入的委托上调用BeginInvoke(),并返回一个函数,该函数在被调用时阻塞并等待传入的函数的结果.你必须为不同的方法签名创建此函数的重载,课程.
一种方法,你可以根据需要调整它,并添加其他行为,如Continuations等.关键是使用闭包和匿名委托.应该在.NET 2.0中工作.
编辑 - 以下是如何使用它:
public static string HelloWorld()
{
return "Hello World!";
}
static void Main(string[] args)
{
var task = BeginTask(HelloWorld); // non-blocking call
string result = task(); // block and wait
}
Run Code Online (Sandbox Code Playgroud)
您将必须使用System.Threading.Thread
类,您可以Task
为.net 3.5 获得类,但不能为.net 2 获得该类。
抱歉
归档时间: |
|
查看次数: |
6278 次 |
最近记录: |