TPL TaskFactory.FromAsync vs Tasks with blocking methods

前端 未结 2 550
感动是毒
感动是毒 2020-12-02 16:02

I was wondering if there were any performance implications between using TPL TaskFactory.FromAsync and using TaskFactory.StartNew on blocking versi

相关标签:
2条回答
  • 2020-12-02 16:39

    Following a copy from a external link:

    Yes. In .NET 4, the Task Parallel Library includes a built in wrapper for the APM pattern (Begin/End): Task.Factory.FromAsync. For example, if you wanted to create a task for a call to Stream's BeginRead/EndRead method, you could do:

    Stream s = ...;
    byte [] buffer = ...;
    Task<int> numBytesRead = Task<int>.Factory.FromAsync(s.BeginRead, s.EndRead, buffer, 0, buffer.Length, null);
    // or with await
    int numBytesRead = await Task<int>.Factory.FromAsync(s.BeginRead, s.EndRead, buffer, 0, buffer.Length, null);
    

    Under the covers, FromAsync is just built on top of TaskCompletionSource. A simple version of FromAsync for this read example would look something like:

    var tcs = new TaskCompletionSource<TResult>();
    s.BeginRead(buffer, 0, buffer.Length, iar =>
    {
        try { tcs.SetResult(s.EndRead(iar)); }
        catch(Exception exc) { tcs.SetException(exc); }
    }, null);
    Task<int> numBytesRead = tcs.Task;
    

    http://social.msdn.microsoft.com/Forums/en/async/thread/ed8a14e8-d19a-42d1-bc3f-7017bdfed09c

    0 讨论(0)
  • 2020-12-02 16:46

    You absolutely want to use FromAsync when an API offers a BeginXXX/EndXXX version of a method. The difference is that, in the case of something like Stream or Socket or WebRequest, you'll actually end up using async I/O underneath the covers (e.g. I/O Completion Ports on Windows) which is far more efficient than blocking multiple CPU threads doing a synchronous operation. These methods provide the best way to achieve I/O scalability.

    Check out this section of the .NET SDK on MSDN entitled TPL and Traditional .NET Asynchronous Programming for more information on how to combine these two programming models to achieve async nirvana.

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