c#使用Async在单独的线程中运行函数,同时继续运行主类

本文关键字:运行 函数 继续 Async 使用 单独 线程 | 更新日期: 2023-09-27 18:15:56

我正在尝试创建一个用于学习目的的应用程序,并在c#书中使用Async。然而,我有困难在我想要的形式实施的想法。请让我知道这是否可行。

基本上,我有一个包含3个类的控制台应用程序。用户在控制台上输入一些数据,然后我有一个执行SQL命令/查询并创建数据表的类。然而,查询实际上需要相当多的时间取决于一天的时间,所以这就是我想要的:我想运行类/函数执行我的sql查询,在主程序中执行下面的一些代码,然后等待sql查询/数据表完成。在此之后,我然后做一个导出到excel。下面是代码的一部分,但我遇到的问题是async命令的语法。我试着做一个任务,这表明sql查询函数的调用,但我得到一个编译器错误,说它不能转换为任务的类型。是否有一种方法可以通过分配我的createReport函数作为任务,然后等待它完成以后?
 if (Regex.IsMatch(Number,@"^'d+$") && Number.Length <= 3)
        {
      reportCreate.createReport(detailLength,detailDate,detailNumber);
   /* ^^ This was my original syntax but I want to make this asynchronous or in 
   a separate thread so I can continue working below.*/ 
   // do some comparing work here while the sql query/datatable is running.
   /* Wait for the datatable thread to finish and then continue with the code 
    below. Is there a way to do this using task and await? */ 

          }

c#使用Async在单独的线程中运行函数,同时继续运行主类

您可以让您的工作在后台运行并等待结果,即:

var task = Task.Run(()=>reportCreate.CreateReport(...));
// Do other work
var report = await task;

话虽这么说,这将只工作,如果CreateReport方法是良好的工作在一个后台线程。

还要注意的是,控制台应用程序中的异步通常表现得很奇怪,因为没有同步上下文可以发回。这意味着如果您想要保证事情正常工作,就需要特别注意。处理这个问题的一个简单方法是不使用async/await,而只是等待结果:

var task = Task.Run(()=>reportCreate.CreateReport(...));
// Do other work
var report = task.Result; // Will block until first task is done

我建议你的第一件事是看看你的ORM提供者(实体框架,ADO。. NET等)提供了一个异步端点。如果是这样,就不需要创建额外的线程,因为数据库工作主要是IO绑定的。

如果没有,你想在不同的线程上执行,你可以使用任务并行库Task类在ThreadPool线程上执行工作:

if (Regex.IsMatch(Number,@"^'d+$") && Number.Length <= 3)
{
    var createReportTask = Task.Run(() => { reportCreate.createReport(detailLength,detailDate,detailNumber }));
    // do some comparing work here while the sql query/datatable is running.
    await createReportTask;
}

请注意,当在控制台应用程序中使用此方法时,您必须确保您的Main方法不会返回,从而终止您的进程。

我强烈建议你寻找真正的异步端点,那些根本不需要使用新线程的端点。