我有一个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语句时,我收到上面显示的错误消息。可能导致什么呢?
答案 0 :(得分:0)
简单地说,即使正在等待的操作尚未完成,如何允许程序继续取消请求。这对于处理这样的错误也很有用。
答案 1 :(得分:0)
通过取消令牌,我在用户点击按钮时停止此线程。
将取消令牌传递给Run(Action, CancellationToken)
并不会奇怪地使Task
(一旦执行)可取消。查看使用CancellationToken.ThrowIfCancellationRequested
的{{3}}。
如果可以说好的任意Task
执行任意代码,请取消自己然后就不需要取消令牌了,因为你可以简单地Task.Cancel()
您可能打算使用example和OpenAsync(CancellationToken)
。
您最终会遇到锁定超时,因为您正在等待“已取消”的未取消任务。