Difference between delegate.BeginInvoke and using ThreadPool threads in C#

前端 未结 1 1915
孤街浪徒
孤街浪徒 2020-12-23 14:04

In C# is there any difference between using a delegate to do some work asynchronously (calling BeginInvoke()) and using a ThreadPool thread as shown below

pu         


        
相关标签:
1条回答
  • 2020-12-23 14:58

    Joe Duffy, in his Concurrent Programming on Windows book (page 418), says this about Delegate.BeginInvoke:

    All delegate types, by convention offer a BeginInvoke and EndInvoke method alongside the ordinary synchronous Invoke method. While this is a nice programming model feature, you should stay away from them wherever possible. The implementation uses remoting infrastructure which imposes a sizable overhead to asynchronous invocation. Queue work to the thread pool directly is often a better approach, though that means you have to co-ordinate the rendezvous logic yourself.

    EDIT: I created the following simple test of the relative overheads:

    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();
    

    On my machine the above test runs in around 20 seconds. Replacing the BeginInvoke call with

    System.Threading.ThreadPool.QueueUserWorkItem(state =>
    {
        Interlocked.Increment(ref counter);
    });
    

    changes the running time to 864ms.

    0 讨论(0)
提交回复
热议问题