C# 单元测试-如何检查类是否并行访问外部资源?

C# 单元测试-如何检查类是否并行访问外部资源?,c#,unit-testing,parallel-processing,task-parallel-library,async-await,C#,Unit Testing,Parallel Processing,Task Parallel Library,Async Await,我有一个从web服务读取一些数据的类。 它应该同时做这件事。 我想写一个单元测试,以确保它是并行的,而不是顺序的 我已经用一个产生延迟(例如1秒)的存根替换了一个web服务。 我测量总的执行时间。如果方法调用的时间少于(delay*1.1),我假设处理是并行进行的,并且测试通过 有没有更优雅的方法来实现这个测试(例如通过测量线程数) PS类当前正在使用TPL实现并行调用: IEnumerable<Task<ItineraryExternalReference>> asyn

我有一个从web服务读取一些数据的类。 它应该同时做这件事。 我想写一个单元测试,以确保它是并行的,而不是顺序的

我已经用一个产生延迟(例如1秒)的存根替换了一个web服务。 我测量总的执行时间。如果方法调用的时间少于(delay*1.1),我假设处理是并行进行的,并且测试通过

有没有更优雅的方法来实现这个测试(例如通过测量线程数)

PS类当前正在使用TPL实现并行调用:

IEnumerable<Task<ItineraryExternalReference>> asyncTasks = from dataSourceSiteId in dataSourceSiteIds
                                                           select this.ProcessBookingAsync(dataSourceSiteId, booking);

var externalReferences = await Task.WhenAll(asyncTasks);
return externalReferences;
IEnumerable asyncTasks=来自dataSourceSiteId中的dataSourceSiteId
选择此.ProcessBookingAsync(数据源站点ID,预订);
var externalReferences=wait Task.WhenAll(异步任务);
返回外部引用;
您可以使用“异步信号”(
TaskCompletionSource
)来控制单元测试存根。在这种情况下,类似这样的情况:

class WebServiceStub : IWebService
{
  public int RequiredConcurrentRequests = 2;
  private TaskCompletionSource<object> _signal = new TaskCompletionSource<object>();
  async Task<T> IWebService.ProcessBookingAsync(id, booking)
  {
    if (Interlocked.Decrement(ref RequiredConcurrentRequests) == 0)
      _signal.TrySetResult(null);
    await _signal.Task;
    return ...;
  }
}
class-WebServiceStub:IWebService
{
公共int-RequiredConcurrentRequests=2;
私有TaskCompletionSource_信号=新TaskCompletionSource();
异步任务IWebService.ProcessBookingAsync(id,预订)
{
if(互锁减量(ref RequiredConcurrentRequests)==0)
_信号。TrySetResult(空);
等待信号任务;
返回。。。;
}
}

这是不理想的,因为它实际上会挂起单元测试而不是失败,但这是单元测试并发过程中的标准。

谢谢,史蒂芬。我很高兴得到你的答复。