不能同时执行任务

时间:2019-09-23 14:00:50

标签: c# async-await task task-parallel-library

我有一个Windows窗体应用程序,可以在我的开发机上很好地工作。但是,我看到发布应用程序后尝试并行运行多个任务的奇怪行为。没有错误,但是没有按预期运行。这是代码:

private async void Button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false;
    try
    {
        var watch = Stopwatch.StartNew();
        textBox1.Text = $"Processing...";

        await SyncAppDbAsync();

        watch.Stop();
        var time = watch.ElapsedMilliseconds;
        textBox1.Text = $"End successfully. Minutes: {String.Format("{0:0.00}", (double)(time / 1000) / 60)}";
    }
    catch (Exception ex)
    {
        textBox1.Text = $"Message: {ex.Message}, Source: {ex.Source}, HResult: {ex.InnerException}";
    }

}

public async Task SyncAppDbAsync()
{
    //delete tables rows
    // I block the UI for some seconds because not want to write
    // a record if is not deleted
    Task.WaitAll(
        AgenteApp.RemoveAllAgentiAppAsync(),
        RubricaApp.RemoveAllRubricheAppAsync(),
       ...
    );

    //read data da from database
    var readAgents = Task.Run(Agent.GetAgentAsync);
    var readAddressBooks = Task.Run(AddressBook.GetAddressBookAsync);
    ...

    await Task.WhenAll(
         readAgents,
         readAddressBooks,
         ...
     );

    //save data on sqlite database(myDb.db)
    var addAgenti = Task.Run(async () =>
    {
        var progrIndicator = new Progress<int>(AgentiProgress);
        var agenti = AgenteApp.FillAgentiAppFromCompanyAsync(await readAgents, progrIndicator);
        await AgenteApp.AddAgentiAppAsync(await agenti);
    });
    var addRubriche = Task.Run(async () =>
    {
        var progrIndicator = new Progress<int>(RubricheProgress);
        var rubriche = RubricaApp.FillRubricheAppFromCompanyAsync(await readAddressBooks, progrIndicator);
        await RubricaApp.AddRubricheAppAsync(await rubriche);
    });


    await Task.WhenAll(
      addAgenti,
      addRubriche,
     ...
    );
}

该代码中的每个任务都对应一个sqlite数据库中的表。该代码从一个sqlite数据库读取数据,然后写入另一个sqlite数据库。

我希望这段代码需要几分钟才能运行。同时,每个应更新的表都有一个进度条。相反,代码仅在几秒钟内运行,进度条永远不会更新,并且数据库表未更改。我在结尾的文本框中看到以下文本:End successfully. Minutes: 0,02

我该怎么做才能理解并解决问题?再次,这可以在我的开发机器上正常工作。

更新: 抱歉,每个人都可以正常工作!我犯了愚蠢的错误 与sqlite数据库的路径。 我在app.config中硬编码:  

我接受有关如何使该路径动态化的建议 再次抱歉

1 个答案:

答案 0 :(得分:1)

在我写这篇文章供我评估问题时,问题中没有足够的信息。但我至少可以提供一些策略,以帮助您自己找到解决方案:

  1. 在代码中添加过多且详细的日志记录(您可以稍后将其删除)。这将帮助您了解程序运行时正在发生的情况,并有可能看到问题出在哪里。如果需要,请在生产中运行此程序,但最好:

  2. 如果还没有,请从您自己的计算机中获得一个暂存或QA环境(如果需要,请使用本地VM),在此环境中可以按需重现问题,而无需进行生产。上一步中的日志记录信息可能对此有所帮助。

  3. 查找异步代码可能隐藏的异常。确保您正在检查每个操作的结果。

  4. 删除大部分代码。该程序将不完整,但是它将按预期运行该不完整的部分。继续添加完整程序的更多小块,直到再次中断为止。此时,您可能(大概)知道了问题所在……虽然这可能是由较早的障碍导致的竞争状况,但至少您会知道从哪里开始寻找线索。

  5. 展开异步代码并使用传统的同步方法运行所有内容。在尝试添加并行性之前,请确保简单的同步代码可在生产环境中工作。

当您最终找到此问题时,请确保您进行了单元测试,以便将来在生产之前检测出该问题,以避免回归。

相关问题