异步方法C#何时发出

异步方法C#何时发出,c#,.net,asynchronous,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 t

最近,我在调用异步方法时遇到了一个问题。 代码如下:

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();
   });
 }
 ...
ClassA存储=新ClassA();//这是班上的一员
异步任务initClassAOObject(){//类的异步方法
列表任务列表=新建列表();//创建列表任务
taskList.Add(Func1());
taskList.Add(Func2());
taskList.Add(Func3());
wait Task.WhenAll(taskList.ToArray());//等待所有任务完成
返回存储;//{
//更新存储的属性A
//示例storage.A=getdatafromwhere();
});
}
异步任务Func2(){
等待任务。运行(()=>{
//更新存储的属性B
//示例storage.B=GetDataFromSomewhere();
});
}
...
问题1:initClassAOObject()方法永远不会返回。断点在“从未返回”命中

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

我到处寻找解决办法,但仍然没有找到。
谢谢。

函数使用相同的源(对象),因为这可能导致死锁?请不要使用相同的对象并查看结果,好吗?

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

可能所有任务都无法完成?您调试了
Func1
Func2
Func3
的功能吗?如果
return storage
从未被点击,那么可能是因为至少有一项任务没有完成。谢谢您的评论。当我同步调用Func1()时,这通常起作用;Funct2();。。然后我切换到这个方法,它不再工作了。那么我想这些函数没有什么问题。不过我会再次确认的。@ĐứcToá和ương听起来像是你们的任务在等待着我。你们从
Func1()
Func2()
返回了什么对象?谢谢你们的回答。我发现我的一个代码未能完成。顺便说一句,虽然它现在可以工作了,但我仍然担心异步修改对象的(不同属性)会导致问题。