如何从Void类调用异步Task函数?

时间:2019-09-16 08:51:48

标签: c#

如何从Void类调用异步Task函数?

假设我是这样建立的,

我想同步调用Run()中的方法,但要在DoSomeStuffAsync和DoSomeStuffAsync 2中调用 它需要对具有异步等待功能的某些功能进行等待。

我的问题是,如何在DoTask1中进行操作,例如使任务运行同步?像现在一样,这些任务只是启动它,而不会等到完全完成。

    static void Main(string[] args)
    {
        Run();
    }

    public void Run()
    {
        DoTask1();
        DoTask2();
    }

    public void DoTask1()
    {
        var tasks = Task.Run(async () =>
        {
            await DoSomeStuffAsync();
            await DoSomeStuffAsync2();
        });

        Task.WaitAll(tasks);
    }

    public void DoTask2()
    {
        var tasks = Task.Run(async () =>
        {
            await DoSomeStuffAsync();
            await DoSomeStuffAsync2();
        });

        Task.WaitAll(tasks);
    }

    private async Task DoSomeStuffAsync(int daysBack)
    {
        try
        {                
            var data= await GetData();                
            var objj = GenerateObjects();

            await InsertToDb(objj ));
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
     }

    private async Task DoSomeStuffAsync2(int daysBack)
    {
        try
        {                
            var data= await GetOtherData();                
            var objj = GenerateObjects();

            await InsertToDb(objj ));
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
     }

2 个答案:

答案 0 :(得分:1)

  

控制台应用程序的静态void Main()正在调用Run()函数。

您有两种选择。对于以下两个选项,您都应首先使Run方法正确异步(即async Task)。

如果这是一个.NET Core项目,则选项A将使Main成为async Task方法。然后,您可以使用async all the way

如果没有,那么您可以进行单个阻止呼叫。我建议您将其放入您的Main方法中,如下所示:

static void Main()
{
  Run().GetAwaiter().GetResult();
}

答案 1 :(得分:-2)

异步void是一个不好的选择,它会生成编译器警告,如果未捕获到异常,则您的应用程序已死,您可能没有合适的调用堆栈来进行调试。但是如果您愿意,您已经有了解决方案 直接调用异步任务方法。并将其包装在异常捕获器中

static void Main(string[] args)
{
   Task callTask = Task.Run(() => Run());
   callTask.Wait();
}

public async Task Run()
{
    await DoSomeStuffAsync();
}