c# - 异步方法 C# WhenAll 问题

标签 c# .net asynchronous

最近我在调用异步方法时遇到了问题。 这是代码:

ClassA storage = new ClassA();// this is member of the class

async Task<ClassA> InitClassAObject(){ // async method of the class


    List<Task> taskList = new List<Task>(); // create list task
        taskList.Add(Func1());
        taskList.Add(Func2());
        taskList.Add(Func3());            

        await Task.WhenAll(taskList.ToArray()); // wait for all task done

        return storage; // <--- this line never be hit
 }

 async Task Func1(){
        await Task.Run(() =>{
          //update property A of storage
          //example storage.A = GetDataFromSomeWhere();
   });
 }

 async Task Func2(){
        await Task.Run(() =>{
          //update property B of storage
          //example storage.B = GetDataFromSomeWhereElse();
   });
 }
 ...

问题 1:方法 InitClassAObject() 永远不会返回。 “return never”处的断点命中。

问题 2:如果我调用多个异步方法并且它们更新对象 ClassA 的不同属性。这样做安全吗?

我四处寻找解决方案,但仍未找到。 谢谢。

最佳答案

关于问题2:更新不同的属性是安全的。但是你应该记住,如果你在 Task1 中读取 SomeProperty 并在 Task2 中修改它结果将是不可预测的(Task1 可能在 Task2 写入之前或之后读取)

关于c# - 异步方法 C# WhenAll 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43064619/

相关文章:

c# - 空参数替代C#6.0

c# - 是否存在 Application.Exit() 不引发 FormClosing 事件的情况?

c# - 我可以在 EF 中以良好的方式获取列表吗

javascript - 字符串参数被解释为日期

c# - 如果一个类有一个公共(public)入口点,将它需要的一切作为参数,它应该是静态的吗?

javascript - 按钮是否可以使用异步 JavaScript 重定向和执行功能

c# - 替换字符串中的多个范围

c# - 在这种特定情况下,我应该如何建模我的代码以最大限度地重用代码?

c# - 对传递给 Task.WhenAll() 的任务使用 ConfigureAwait(false) 失败

javascript - 如何等待一组异步回调函数?