WPF线程和任务的textchanged事件

本文关键字:textchanged 事件 任务 线程 WPF | 更新日期: 2023-09-27 18:05:51

使用Visual Studio 2012 ulti, c# . net WPF.

在我的代码中使用任务在winforms曾经是很简单的。

我所要做的就是创建一个委托,为我的代码创建一个函数,创建一个任务和一个简单的按钮事件。简单的东西。我的问题是……

  • 像往常一样创建一个线程,但是事件将在上更改文本。

我的问题是考虑逻辑,如果我简单地改变事件,我看不到这个工作,因为用户可以输入比代码运行更快的速度(在这种情况下,一个sql查询选择语句)。在那里,它会尝试运行许多任务,我甚至认为不会工作。

基本用户输入用于按名称或号码搜索帐号的文本框。在这个文本框中,我想线程化整个进程。

我能想到的唯一解决方案是作为文本改变如果有一个线程仍在运行停止该线程创建一个新的,但不确定如果这是一个干净的方式做它作为一个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);
}

然后简单地启动task on event:

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

你可以看到一些简单的东西,但是简单的改变事件似乎把整个逻辑弄乱了。

WPF线程和任务的textchanged事件

我建议将此逻辑从任务移动到Timer回调中,然后让您的OnTextChanged处理程序在每次触发计时器时实际重置计时器(当然只有计时器触发一次)。通过让计时器在0.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往返,并在第一次命中后为您提供工作缓存(应该比尝试缓存所有内容要小)。