直接搜索栏的线程取消令牌
Thread cancellation token for direct search bar
我有一个由搜索栏过滤的数据网格视图。我想在 keyup 上重现 google 之类的搜索。
由于数据库可能会变大,我试图取消之前对下一个字符输入的搜索(目前速度非常快,所以我设置了休眠)。
似乎每次取消订单和新建订单之间都没有检查canceltoken。 (第 2 行和第 5 行)这看起来很正常,但为此目的而烦恼。
是否有针对所述令牌的 "Show this to all thread before setting a new one" 方法?或者调用旧令牌的方法?也许是一个清单?设置带有日期时间的字典?
非常欢迎任何关于这种系统的建议。
private CancellationTokenSource cts { get; set; }
protected async void SearchGrid(object Sender, EventArgs e)
{
FullGridView.CurrentCell = null;
cts = cts ?? new CancellationTokenSource
();
cts.Cancel();
List<string> SearchFor = Box.Text.Split(null).ToList();
cts = new CancellationTokenSource();await Task.Run(() =>
{
try
{
foreach (DataGridViewRow Row in FullGridView.Rows)
{ if ((Row.Cells[0].Value as bool?) == true)
{ continue; }
cts.Token.ThrowIfCancellationRequested();
bool Found = false;
Found = SearchFor.All(s =>
ColumnIndexToSearch.Any(c =>
Row.Cells[c].Value != null &&
Row.Cells[c].Value.ToString().ToUpperInvariant()
.Contains(s.ToUpperInvariant())));
SyncCtx.Post(delegate
{
Row.Visible = Found;
}, null);
Thread.Sleep(5000); //Test purpose
}
}
catch
{
return;
}
}, cts.Token);
最后我创建了一个 List<CancellationTokenSource> cts
然后我取消了 Last()
然后创建了一个新的。它使令牌保持活动状态并避免竞争条件。
我有一个由搜索栏过滤的数据网格视图。我想在 keyup 上重现 google 之类的搜索。
由于数据库可能会变大,我试图取消之前对下一个字符输入的搜索(目前速度非常快,所以我设置了休眠)。
似乎每次取消订单和新建订单之间都没有检查canceltoken。 (第 2 行和第 5 行)这看起来很正常,但为此目的而烦恼。
是否有针对所述令牌的 "Show this to all thread before setting a new one" 方法?或者调用旧令牌的方法?也许是一个清单?设置带有日期时间的字典?
非常欢迎任何关于这种系统的建议。
private CancellationTokenSource cts { get; set; }
protected async void SearchGrid(object Sender, EventArgs e)
{
FullGridView.CurrentCell = null;
cts = cts ?? new CancellationTokenSource
();
cts.Cancel();
List<string> SearchFor = Box.Text.Split(null).ToList();
cts = new CancellationTokenSource();await Task.Run(() =>
{
try
{
foreach (DataGridViewRow Row in FullGridView.Rows)
{ if ((Row.Cells[0].Value as bool?) == true)
{ continue; }
cts.Token.ThrowIfCancellationRequested();
bool Found = false;
Found = SearchFor.All(s =>
ColumnIndexToSearch.Any(c =>
Row.Cells[c].Value != null &&
Row.Cells[c].Value.ToString().ToUpperInvariant()
.Contains(s.ToUpperInvariant())));
SyncCtx.Post(delegate
{
Row.Visible = Found;
}, null);
Thread.Sleep(5000); //Test purpose
}
}
catch
{
return;
}
}, cts.Token);
最后我创建了一个 List<CancellationTokenSource> cts
然后我取消了 Last()
然后创建了一个新的。它使令牌保持活动状态并避免竞争条件。