【问题标题】:Simultaneous tasks not run [closed]未运行的同时任务[关闭]
【发布时间】:2019-09-23 23:05:09
【问题描述】:

我有一个在我的开发机器上运行良好的 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 中硬编码:

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

【问题讨论】:

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


【解决方案1】:

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

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

  2. 如果您还没有,请获得一个与您自己的机器分开的暂存或 QA 环境(如果确实需要,请使用本地 VM),您可以在其中按需重现问题,远离生产.上一步的日志信息可能对此有所帮助。

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

  4. 删除大部分代码。该程序将不完整,但它将按预期运行该不完整部分。继续添加完整程序的更多小块,直到它再次中断。此时,您将(可能)知道问题出在哪里......虽然它可能是由较早的块引起的竞争条件,但至少您会知道从哪里开始寻找。

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

当您最终追查到此问题时,请确保您有一个单元测试,可以在问题投入生产之前检测到该问题,以避免回归。

【讨论】:

  • 这只是一个评论,但是太长了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 2021-01-12
相关资源
最近更新 更多