C#中如果将一个对象传递给多个异步函数,是否需要考虑并发性?

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

因此,我有一个用例,我想将对象传递给同时工作的异步函数。每个函数都会更新对象的不同独立部分。所以,我怀疑这会导致列表出现并发问题吗?

class Error 
{
    public object fieldA;
    public object fieldB;
    public object fieldC;
}

var error = new Error();
var awaitedTasks = new List<Task>();

awaitedTasks.Add(funcA(error));  // this async function will update only fieldA
awaitedTasks.Add(funcB(error));  // this async function will update only fieldB
awaitedTasks.Add(funcC(error));  // this async function will update only fieldC

await Task.WhenAll(awaitedTasks);

private async Task funcA(Error error)
{
    error.fieldA = await FetchAFromDbAsync();
}

private async Task funcB(Error error)
{
    error.fieldB = await FetchBFromDbAsync();
}

private async Task funcC(Error error)
{
    error.fieldC = await FetchCFromDbAsync();
}

因此,添加更多上下文,这里我们在不同函数中丰富错误的不同字段。

c# async-await concurrency thread-safety
1个回答
0
投票

为了真正确定,您应该向我们展示这三种方法的真正作用。我假设一些简单的代码如下:

private async Task funcA(Error error)
{
  await Task.Delay(1000);
  error.fieldA = "funcA finished";
}

private async Task funcB(Error error)
{
  await Task.Delay(1000);
  error.fieldB = "funcB finished";
}

private async Task funcC(Error error)
{
  await Task.Delay(1000);
  error.fieldC = "funcC finished";
}

这样的话,你就安全了。但如果这些方法访问共享变量,您可能会遇到一些麻烦。但这只有看到你完整的代码才能判断。

© www.soinside.com 2019 - 2024. All rights reserved.