[英]Cancelling thread task
我有一个MySQL连接,该连接正在以Task表示的单独线程中执行查询。
通过取消令牌,当用户单击按钮时,我将停止该线程。
我的问题是正在显示一条错误消息,内容如下: Lock wait timeout exceeded; try restarting transaction
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语句时,出现上述错误消息。 是什么原因造成的?
本文可能对您有用: http : //blogs.msdn.com/b/pfxteam/archive/2012/10/05/how-do-i-cancel-non-cancelable-async-operations.aspx
简而言之,这里写着如何允许程序在取消请求后继续执行,即使等待的操作尚未完成。 这对于处理此类错误也应该是有用的。
通过取消令牌,当用户单击按钮时,我将停止该线程。
将取消令牌传递给Run(Action, CancellationToken)
不会神奇地使Task
(一旦执行)可取消。 看一下使用CancellationToken.ThrowIfCancellationRequested
的示例 。
如果可以说任意Task
执行任意代码,请取消自己,那么就不需要取消令牌,因为您可以简单地执行Task.Cancel()
。
您可能打算使用OpenAsync(CancellationToken)
和ExecuteNonQueryAsync(CancellationToken)
。
您最终将获得锁定超时,因为您正在等待“已取消”的非取消任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.