繁体   English   中英

WPF线程和textchanged事件上的任务

[英]WPF threads and tasks on textchanged event

使用Visual Studio 2012 ulti,C#.NET WPF。

在我的winforms代码中使用Tasks曾经很简单。

我要做的就是创建一个委托,为我的代码创建一个函数,创建一个任务,该事件将是一个简单的按钮。 简单的东西。 我的问题是以下...

  • 像平常一样创建一个线程,但是该事件将在文字更改后发生

我正在考虑逻辑问题,如果我只是更改事件,由于用户键入的速度可能比代码运行的速度快(在这种情况下为sql query select语句),我看不到它的运行。 在那里,它将尝试运行许多我什至认为不起作用的任务。

基本上,用户输入用于按名称或数字搜索帐户的文本框。 在此文本框中,我想将整个过程穿线。

我能想到的唯一解决方案是, 如果还有一个线程仍在运行,请更改文本然后停止该线程创建一个新 线程 ,但是不确定这是否是一种干净的方法,因为它会调用sql存储过程。

那么有人能解决这个问题吗?

如果您需要更多信息,请询问。 病态还提供一些当前可用于在需要时帮助您理解的代码...

设置调用方法:

private void SetDataGrid(bool AutoGenerateColumns, Object DataSource, String DataMember, DataGridViewAutoSizeColumnsMode Mode)
    {
        if (this.ParetoGrid.InvokeRequired)
        {
            this.ParetoGrid.Invoke(new Action<bool, Object, String, DataGridViewAutoSizeColumnsMode>(SetDataGrid),
                                      AutoGenerateColumns, DataSource, DataMember, Mode);
        }
        else
        {
            this.ParetoGrid.AutoGenerateColumns = AutoGenerateColumns;
            this.ParetoGrid.DataSource = DataSource;
            this.ParetoGrid.DataMember = DataMember;
            ParetoGrid.AutoResizeColumns(Mode);
        }
    }

在另一个方法中调用invoke方法:

Private void GetSomething()
{
    //sql code get data
    SetDataGrid(true, dataSet1, "Pareto", DataGridViewAutoSizeColumnsMode.AllCells);
}

然后只需在事件上启动任务:

private void myButton_Click(Object sender, EventArgs e)
{
    Task t = new Task(() => getSomething());
    t.Start();
}

如您所见,简单的事物,但是简单的更改事件似乎使整个逻辑混乱了。

您可以在所有帐户进入此搜索模式时简单地对其进行缓存。 然后,当缓存的帐户在文本框中输入文本时,便可以进行搜索。 对于每个按键,在不同的线程中执行查询非常繁琐。

我建议将这个逻辑从任务中移到Timer回调中,然后让您的OnTextChanged处理程序在每次触发时实际上都重置计时器(当然,只触发一次计时器)。 通过使计时器经过.5-1秒或类似的时间,您将等到输入了所有文本后才真正调用逻辑。 但是用户的体验仍然会非常敏感。

例:

private System.Threading.Timer keyEntryTimer = new Timer(Logic,null,-1,-1);

public void HandleEvent(objet sender, EventArgs args)
{
    keyEntryTimer.Change(500,-1);
}

public void Logic(objet state)
{
    //Your task logic would go here to read from the text etc... 
    //You'll have to handle any UI updates either by firing off a task once the DB results return or using a dispatcher
}

我可能会结合其他建议的答案,尝试使用计时器或类似方法延迟SQL语句的启动,但是如果用户延迟了足够长的时间以使SQL能够启动,则尝试仅过滤返回的结果,指出这一点(仅当搜索字符串的限制明显变得更加严格时)。 这可以节省您昂贵的SQL往返行程,并在第一次命中后为您提供有效的缓存(应该比尝试缓存所有内容时要小)。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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