取消线程任务

时间:2014-10-13 11:15:39

标签: c# mysql sql .net multithreading

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

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

我的问题是提出错误说明如下: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语句时,我收到上面显示的错误消息。可能导致什么呢?

2 个答案:

答案 0 :(得分:0)

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

简单地说,即使正在等待的操作尚未完成,如何允许程序继续取消请求。这对于处理这样的错误也很有用。

答案 1 :(得分:0)

  

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

将取消令牌传递给Run(Action, CancellationToken)并不会奇怪地使Task(一旦执行)可取消。查看使用CancellationToken.ThrowIfCancellationRequested的{​​{3}}。

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

您可能打算使用exampleOpenAsync(CancellationToken)

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

相关问题