【问题标题】:Cancelling thread task取消线程任务
【发布时间】:2014-10-13 11:15:39
【问题描述】:

我有一个 MySQL 连接,它在一个单独的线程中执行一个查询,由一个 Task 表示。

通过取消令牌,当用户单击按钮时,我将停止此线程。

我的问题是出现以下错误:Lock wait timeout exceeded; try restarting transaction

这是我的代码:

cancellationToken = new CancellationTokenSource();

 await Task.Run(() =>
     {
       using (MySqlConnection connection = new MySqlConnection(sourceDatabaseConnectionString))
            {
               connection.Open();

                using (MySqlCommand command = new MySqlCommand(sql, connection))
                        {
                            command.CommandTimeout = 0;
                            command.Parameters.AddWithValue("@month", datePicker.Value.Month);
                            command.Parameters.AddWithValue("@year", datePicker.Value.Year);
                            int rows = command.ExecuteNonQuery();
                            }
                        }
            }
     }, cancellationToken.Token);

按下按钮时,我正在呼叫cancellationToken.Cancel();

当我尝试通过启动任务再次执行 SQL 语句时,我收到如上所示的错误消息。可能是什么原因造成的?

【问题讨论】:

  • 我打赌最有趣的部分是在“//执行查询”评论下
  • @vtortola - 这个问题似乎并没有解释如何解决它,除了手动杀死 MySQL 中的进程。取消线程/任务时,查询也应该取消,不是吗?
  • 我认为问题可能出在您在此处使用的 SQL 和其他查询中,与您的 C# 代码没有直接关系。可能当您调用“取消”时,该代码中会引发异常,您应该捕获以“回滚”事务,否则当您再次尝试运行时锁定仍然存在。
  • 为什么任务会被取消?没有什么可以实际观察到取消。你不想ExecuteNonQueryAsync(cancellationToken.Token)吗?你只是假设它被取消了吗?我怀疑 TPL 会 Thread.AbortTask 取消它。

标签: c# mysql sql .net multithreading


【解决方案1】:

通过取消令牌,当用户单击按钮时,我将停止此线程。

将取消令牌传递给Run(Action, CancellationToken) 不会神奇地使Task(一旦执行)可取消。查看使用CancellationToken.ThrowIfCancellationRequestedexample

如果可以说可以任意Task 执行任意代码,请自行取消那么就不需要取消令牌,因为你可以简单地执行Task.Cancel()

您可能打算使用OpenAsync(CancellationToken)ExecuteNonQueryAsync(CancellationToken)

您最终会遇到锁定超时,因为您正在等待“已取消”未取消的任务。

【讨论】:

    【解决方案2】:

    这篇文章可能对你有用:http://blogs.msdn.com/b/pfxteam/archive/2012/10/05/how-do-i-cancel-non-cancelable-async-operations.aspx

    简而言之,它写了如何允许程序在取消请求时继续,即使正在等待的操作尚未完成。这对于处理此类错误也应该很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 2014-01-19
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多