当前位置: 首页 > 知识库问答 >
问题:

在同步方法中运行任务。运行()而不等待()有什么含义?

有翰海
2023-03-14

我有一个旧式代码计时器,每2秒运行一次长时间的数据库更新查询,类似这样

 private void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
      MySyncMethod();
    }
    
    private void MySyncMethod()
    {
      Task.Run(()=>{Run a long running DB update query});
    }

假设我们不需要DB更新结果,那么在上面的代码中不等待任务完成会有什么影响吗?

Task.Run(()=>{Update something in DB}).Wait();

在我的理解中,当我们称之为任务时。Run()从线程池中获取新的/可用的线程,任务在此线程中运行。因为我们称之为任务。从sync方法运行()时,我们不会记住当前的同步上下文,并在任务完成时恢复它,就像等待任务一样。在异步方法中运行()。因此,我的另一个问题是,当任务完成时,后续命令是在任务的线程中执行还是在原始线程中执行,即MySyncMethod()线程?例如,如果我的方法如下所示

私有无效MySyncMethod()

   {
      Task.Run(()=>{Run a long running DB update query});
     ... Do something after Task is completed
    }

是做点什么。。。任务完成后在任务的线程或MySyncMethod()线程中执行?

共有1个答案

夏骞尧
2023-03-14

对不起,MBK,你有很多问题,所以我需要在这里回答:

不,这取决于:

  • 如果任务有10个线程和0个-

我不知道你的确切意思,但是如果你只是调用任务。运行(...)您无法知道您的查询是否可以在主线程上成功运行。

对我来说,我不会使用任务。只运行(...),我总是需要知道查询的结果,所以我会使用任务。运行(...)。等待()或者如果我不想阻塞主线程,我会结合回调来处理查询结果,如下所示:

Task.Run(()=>{
 try {
   //Run a long running DB update query
   callback.onQueryRunSuccess();
 }
 catch(Exception e) {
      callback.onQueryRunFailed(e);
 }
});
 类似资料:
  • 我在网上搜索了很多关于vs await async,但是在这个特定的使用场景中,我并不真正理解其中的区别。我相信情况很简单。 vs. 其中,是一个异步方法,其中包含一些异步调用,例如使用wait调用db。 问题: 在这种情况下,两者之间有什么区别吗?任何帮助或意见,谢谢!

  • 我们有一个async/await方法,它通过实体框架调用存储的过程,该框架由同步方法调用。 需要很长的时间来执行,这可能就是我们编写async/await的原因,它可以被多个地方使用。 我知道我们不应该混合异步和同步调用,但假设我们有这种情况并且我们正在使用 从同步方法 调用异步方法 GetLoanDataAsync,我理解该方法 - 将在后台线程上运行。 我的问题是,如果我们有一个异步方法< c

  • 我只想确保我很好地理解异步await和task.run或task.whenall之间的区别 所以异步等待就是处理异步方法。它意味着隐含着一个处理顺序。 我在不阻塞主线程的情况下运行了一个很长的处理,并等待结果继续。 对于task.run和task.when,这里有一个多线程的新概念。这意味着我可以在一个新线程上启动一个长进程,它不会等待完成来继续代码。代码在新线程上。在这个线程上,我可以等待方法。

  • 使用asyn/wait vs wait有什么区别task.run() 等待任务。运行示例- 异步等待示例-

  • 我试图了解 Task.Run Wait() 异步等待是如何工作的。 我已经阅读了这个页面:了解在一行中使用Task.Run Wait()异步等待的使用,但不太理解它。 在我的代码中,我从Microsoft EventHub接收事件,并使用实现的类处理它们。我在 () 中调用 方法,这是一个异步方法,这是一个方法。由于该方法是的,因此我使用 和来委派。(即 或< code >。Wait()(该方法是

  • 我的makefile中的一个目标是一个非常耗时的CPU任务。但是我可以分割工作负载并并行运行任务几次,以加快整个过程。 我的问题是make不会等待所有过程完成。 考虑一下这个简单的脚本,名为“代码> MyTask.SH <代码>: 现在,让我们从bash脚本调用它,并使用等待所有任务完成: 产出如预期: 但是在Makefile中尝试相同的方法时: 它不起作用: 当然,我可以创建多个目标,这些目标可