C# I';我想知道为什么我的handler函数同时运行它的所有函数而不互相等待?
我想知道为什么我的handler函数同时运行它的所有函数而不等待其他函数 有人能告诉我为什么我的处理程序同时执行func1和func2吗 我的method1和method2工作得很好,它们在等待前一个完成时执行。但当它执行处理程序时 但是func1和func2同时异步运行。我怎样才能解决这个问题C# I';我想知道为什么我的handler函数同时运行它的所有函数而不互相等待?,c#,C#,我想知道为什么我的handler函数同时运行它的所有函数而不等待其他函数 有人能告诉我为什么我的处理程序同时执行func1和func2吗 我的method1和method2工作得很好,它们在等待前一个完成时执行。但当它执行处理程序时 但是func1和func2同时异步运行。我怎样才能解决这个问题 public void Run() { lock (_theLock) { Task.Run(async () => {
public void Run()
{
lock (_theLock)
{
Task.Run(async () => {
await method1();
await method2();
await handler();
});
}
}
调用func1或Func2的处理程序方法:
private async Task handler() {
await _timer.func1();
await _timer.func2(); }
_计时器类别:
public class _timer
public async void func1()
{
lock (lock)
{
test1();
}
}
public async void func2()
{
lock (lock)
{
test2();
}
}
public async Task test1()
{
await method1(); // the same method as in the run method
}
public async Task test2()
{
await method2(); // the same method as in the run method
}
public async Task method1()
{
var test1 = await GetDataFromSource1();
await doStuff(test1);
}
public async Task func2()
{
await method2(); // the same method as in the run method
}
public async Task method2()
{
var test2 = await GetDataFromSource2();
await doStuff(test2);
}
public async Task<List<items>> GetDataFromSource1() {
// retrieves data from database SQL
}
public async Task<List<items>> GetDataFromSource2() {
// retrieves data from database SQL
}
public async Task doStuff(List<string> items) {
// does stuff with the data
}
公共类\u计时器
公共异步void func1()
{
锁(锁)
{
test1();
}
}
公共异步void func2()
{
锁(锁)
{
test2();
}
}
公共异步任务test1()
{
wait method1();//与run方法中的方法相同
}
公共异步任务test2()
{
wait method2();//与run方法中的方法相同
}
公共异步任务方法1()
{
var test1=等待GetDataFromSource1();
等待doStuff(测试1);
}
公共异步任务func2()
{
wait method2();//与run方法中的方法相同
}
公共异步任务方法2()
{
var test2=等待GetDataFromSource2();
等待doStuff(测试2);
}
公共异步任务GetDataFromSource1(){
//从数据库SQL检索数据
}
公共异步任务GetDataFromSource2(){
//从数据库SQL检索数据
}
公共异步任务doStuff(列表项){
//他会处理数据
}
问题1:异步无效
-调用方无法知道何时完成;使用异步任务
或异步值任务
;您几乎不应该使用async void
问题2:调用test1
或test2
时,您没有等待,因此。。。什么都没等
问题3:您不能将lock
与await
一起使用-您需要使用不同的锁定原语,可能是信号量lim(1,1)
(其工作方式类似于互斥)
观察发现:这些代码实际上都不是真正的异步的问题1:
异步无效
-调用者无法知道它何时完成;使用异步任务
或异步值任务
;您几乎不应该使用async void
问题2:调用test1
或test2
时,您没有等待,因此。。。什么都没等
问题3:您不能将lock
与await
一起使用-您需要使用不同的锁定原语,可能是信号量lim(1,1)
(其工作方式类似于互斥)
obersvation:这些代码实际上都不是真正的异步的首先,您应该避免异步void。 始终将任务用作异步方法的返回类型 有关异步编程的更多详细信息,请参阅 另一件事是wait操作并不意味着执行流将等待该方法的执行完成 这意味着它将调用该方法并尝试执行进一步的语句 但在所有等待操作完成之前,它不会离开当前方法
希望这有帮助。首先,您应该避免异步void。 始终将任务用作异步方法的返回类型 有关异步编程的更多详细信息,请参阅 另一件事是wait操作并不意味着执行流将等待该方法的执行完成 这意味着它将调用该方法并尝试执行进一步的语句 但在所有等待操作完成之前,它不会离开当前方法
希望这能有所帮助。您建议我应该怎么做才能使代码正确?也许这会让我更好地理解。您必须使用Task作为func1和func2的返回类型。然后必须从func1和func2中删除lock语句。我真的必须返回什么吗?因为我在DoStuff method2中设置缓存中返回的数据?我可以执行返回任务吗?如果返回类型为Task,则表示异步方法没有返回任何内容。如果您想要返回,比如int,那么返回类型应该是Task。希望这有帮助。但是所有的方法并没有真正返回任何东西,因为它唯一的作用是它只告诉方法2做这件事,就是这样。你建议我应该怎么做才能使我的代码正确?也许这会让我更好地理解。您必须使用Task作为func1和func2的返回类型。然后必须从func1和func2中删除lock语句。我真的必须返回什么吗?因为我在DoStuff method2中设置缓存中返回的数据?我可以执行返回任务吗?如果返回类型为Task,则表示异步方法没有返回任何内容。如果您想要返回,比如int,那么返回类型应该是Task。希望这有帮助,但是所有的方法都没有真正返回任何东西,因为它只会对方法2说,做这个,做那个it@FredrikLinger公平地说,这解决了“观察”问题,其余的问题仍然存在,但通过观察当前的代码,使用锁对我来说有意义吗?test1每24小时更新一次缓存数据,func2使用更新后的缓存数据来完成任务。@FredrikLinger我无法告诉您是否需要某种同步-这取决于您的代码和场景;然而,我可以告诉你,在这种情况下,你不能使用
lock
——因此我提到了信号量lim,你能看到我的处理程序同时执行这两个函数的原因吗?@FredrikLinger是的,这是我已经发布的答案中的问题1和2;我提到他们是因为他们是公关