Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# I';我想知道为什么我的handler函数同时运行它的所有函数而不互相等待?_C# - Fatal编程技术网

C# I';我想知道为什么我的handler函数同时运行它的所有函数而不互相等待?

C# I';我想知道为什么我的handler函数同时运行它的所有函数而不互相等待?,c#,C#,我想知道为什么我的handler函数同时运行它的所有函数而不等待其他函数 有人能告诉我为什么我的处理程序同时执行func1和func2吗 我的method1和method2工作得很好,它们在等待前一个完成时执行。但当它执行处理程序时 但是func1和func2同时异步运行。我怎样才能解决这个问题 public void Run() { lock (_theLock) { Task.Run(async () => {

我想知道为什么我的handler函数同时运行它的所有函数而不等待其他函数

有人能告诉我为什么我的处理程序同时执行func1和func2吗

我的method1和method2工作得很好,它们在等待前一个完成时执行。但当它执行处理程序时

但是func1和func2同时异步运行。我怎样才能解决这个问题

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;我提到他们是因为他们是公关