【问题标题】:Wrapping events with TaskCompletionSource vs. BufferBlock<T>使用 TaskCompletionSource 与 BufferBlock<T> 包装事件
【发布时间】:2015-08-22 01:07:03
【问题描述】:

Lucian 在这里讨论了一个模式 (Tip 3: Wrap events up in Task-returning APIs and await them)。

我正在尝试在一个经常调用的方法上实现它,该方法看起来像下面的人为代码:

public Task BlackBoxAsync() 
{ 
    var tcs = new TaskCompletionSource<Object>();  // new'ed up every call
    ThreadPool.QueueUserWorkItem(_ => 
    { 
        try 
        { 
            DoSomethingStuff(); 
            tcs.SetResult(null); 
        } 
        catch(Exception exc) { tcs.SetException(exc); } 
    }); 
    return tcs.Task; 
}

我担心性能,因为每次调用都会更新TaskCompletionSource(假设我每 100 毫秒调用一次此方法)。

我当时正在考虑改用BufferBlock&lt;T&gt;,认为它不会在每次调用时都更新。所以它看起来像:

private readonly BufferBlock<object> signalDone; // dummy class-level variable, new'ed up once in CTOR

public Task BlackBoxAsync() 
{ 

    ThreadPool.QueueUserWorkItem(_ => 
    { 
        try 
        { 
            DoSomethingStuff(); 
            signalDone.Post(null);
        } 
        catch(Exception exc) {  } 
    }); 
    return signalDone.ReceiveAsync(); 
}

调用对象会这样称呼它:

for (var i=0; i<10000; i++) {
 await BlackBoxAsync().ConfigureAwait(false);
}

有人对改用BufferBlock&lt;T&gt; 有任何想法吗?

【问题讨论】:

  • 你知道响应式扩展吗?
  • 这是“新”并且比 TAP 更好吗?
  • Rx 比 TAP 早,但 it was updated to use TAP 在 4.5 发布时。它是一个框架,而不是一个单独的系统(有点像 Entity Framework vs SqlCommand)。

标签: c# async-await task-parallel-library tpl-dataflow taskcompletionsource


【解决方案1】:

无论您将采用哪种解决方案,如果您想在每次调用此方法时 await 一个任务,创建一个新的 Task 是不可避免的,因为任务不可重用。最简单的方法是使用TaskCompletionSource

所以第一个选项比使用BufferBlock(不出所料,creates a new TaskCompletionSource on ReceiveAsync)更可取 IMO


更重要的是,您的代码似乎只是将工作卸载到ThreadPool 并返回代表该工作的任务。为什么不使用简单的Task.Run

public Task BlackBoxAsync() 
{
    return Task.Run(() => DoSomethingStuff());
}

【讨论】:

  • 感谢您的意见。该方法是人为的,只是为了说明场景。我真正的用途其实是一个由TaskCompletionSource包裹的事件。
  • @alpinescrambler 知道了。所以忽略第二部分。
猜你喜欢
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2014-01-15
  • 2012-08-19
相关资源
最近更新 更多