使用 Parallel.Invoke 或并行调用的替代方案时避免 async void 和 .Wait()

问题描述 投票:0回答:1

我正在编写一个集成测试,我想避免 .Wait() 调用

public void MyTest_MultiClient_NoException()
{
    Action action = () => Reader.Read(@"C:\MyFolder\MyFile.data").Wait();
    var actions = Enumerable.Repeat(action, 1000).ToArray();

    Parallel.Invoke(actions);
}

或 async void 被 Visual Studio 警告(“当委托类型返回 'void' 时避免使用 'async' lambda)。

public void MyTest_MultiClient_NoException()
{
    Action action = async () => await Reader.Read(@"C:\MyFolder\MyFile.data");
    var actions = Enumerable.Repeat(action, 1000).ToArray();

    Parallel.Invoke(actions);
}

我在 Reader 的静态构造函数的方法中使用了互斥体。因此,我想使用 Parallel.Invoke (或并行调用的替代方法)模拟多客户端环境,以测试 TimeOutException。

Reader.Read
返回一个可等待的类
Job<TResult>

提前谢谢您。

我尝试切换到

Func<Job<TResult>>
而不是
Action
,但 Parallel.Invoke 对此没有重载。

c# asynchronous async-await parallel-processing parallel.invoke
1个回答
0
投票

由于

Reader.Read
返回可等待类型,您可以
await
它并使用
Task<TResult>
 LINQ 运算符将其投影到 
Select
。然后使用
Task.WaitAll
方法等待所有任务。

public void MyTest_MultiClient_NoException()
{
    Task<TResult>[] tasks = Enumerable.Range(0, 1000)
        .Select(async _ => await Reader.Read(@"C:\MyFolder\MyFile.data"))
        .ToArray();

    Task.WaitAll(tasks);
}
© www.soinside.com 2019 - 2024. All rights reserved.