直接搜索栏的线程取消令牌

时间:2017-04-20 09:57:04

标签: c# multithreading search cancellationtokensource

我有一个搜索栏过滤的datagridview。我想在关键字上重现谷歌搜索。

由于数据库可能会变大,我试图在下一个charachter输入上取消先前的搜索(目前它非常快,所以我设置了睡眠)。

似乎每次取消订单和新创建之间都不会检查canceltoken。 (第2行和第5行)看起来很正常,但是为此目的很烦人。

是否有"在设置新线程之前向所有线程显示此信息"所述令牌的方法?还是一种调用旧令牌的方法?也许一个清单?设置一个日期时间的词典?

对这种系统的任何建议都会非常受欢迎。

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);

1 个答案:

答案 0 :(得分:0)

最后我创建了一个List<CancellationTokenSource> cts,然后取消Last(),然后创建一个新的{{1}}。它使令牌保持活力并避免竞争条件。