nig*_*457 31 c# multithreading threadpool
在C#中,使用委托异步地执行某些工作(调用BeginInvoke())和使用ThreadPool线程之间有任何区别,如下所示
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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
BeginInvoke确保线程池中的线程用于执行异步代码,所以有什么区别吗?
Lee*_*Lee 33
Joe Duffy在他的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();
Run Code Online (Sandbox Code Playgroud)
在我的机器上,上述测试运行大约20秒.用...替换BeginInvoke呼叫
System.Threading.ThreadPool.QueueUserWorkItem(state =>
{
Interlocked.Increment(ref counter);
});
Run Code Online (Sandbox Code Playgroud)
将运行时间更改为864ms.
| 归档时间: |
|
| 查看次数: |
14874 次 |
| 最近记录: |