在C#是有使用委托做一些工作以异步方式(调用的BeginInvoke()),并使用线程池线程之间的任何差异,如下所示
public void asynchronousWork(object num)
{
//asynchronous work to be done
Console.WriteLine(num);
}
public void test()
{
Action<object> myCustomDelegate = this.asynchronousWork;
int x = 7;
//Using Delegate
myCustomDelegate.BeginInvoke(7, null, null);
//Using Threadpool
ThreadPool.QueueUserWorkItem(new WaitCallback(asynchronousWork), 7);
Thread.Sleep(2000);
}
编辑:
的BeginInvoke可以确保从线程池中的线程来执行异步代码,那么有没有什么区别?
乔·达菲,他Concurrent Programming on Windows
的书(418页)说,这大约Delegate.BeginInvoke
:
所有委托类型,按照约定提供的BeginInvoke和EndInvoke
方法一起普通的同步Invoke
方法。 虽然这是一个很好的编程模型的功能,你应该远离他们尽可能。 实现使用这带来相当大的开销,异步调用远程基础设施。 队列工作线程池经常直接是一个更好的办法,虽然这意味着你必须自己统筹交会逻辑。
编辑:我创建了相对开销如下简单的测试:
int counter = 0;
int iterations = 1000000;
Action d = () => { Interlocked.Increment(ref counter); };
var stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
for (int i = 0; i < iterations; i++)
{
var asyncResult = d.BeginInvoke(null, null);
}
do { } while(counter < iterations);
stopwatch.Stop();
Console.WriteLine("Took {0}ms", stopwatch.ElapsedMilliseconds);
Console.ReadLine();
在我的机器上面的测试在20秒左右运行。 更换BeginInvoke
调用与
System.Threading.ThreadPool.QueueUserWorkItem(state =>
{
Interlocked.Increment(ref counter);
});
改变了运行时间864ms。