异步方法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()
返回了什么对象?谢谢你们的回答。我发现我的一个代码未能完成。顺便说一句,虽然它现在可以工作了,但我仍然担心异步修改对象的(不同属性)会导致问题。