繁体   English   中英

取消线程任务

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM