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

问题描述 投票: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’时避免使用‘异步’lambda)。异步 void 位于 Action action = async () ...

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.Read
中使用互斥体。因此,我想使用
Parallel.Invoke
(或并行调用的替代方法)模拟多客户端环境,以测试 TimeOutException。

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

public static class Reader
{
    public static Job<TResult> Read() { }
}

提前谢谢您。

附注我尝试切换到

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.