textchanged事件上的WPF线程和任务

时间:2013-03-26 14:04:26

标签: c# wpf multithreading task

使用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);
}

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

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

正如你可以看到简单的东西,但简单的变化事件似乎弄乱了整个逻辑。

3 个答案:

答案 0 :(得分:0)

您可以在进入此搜索模式时简单地缓存所有帐户。然后,您可以在文本框中输入文本时搜索缓存帐户。在每个按键的不同线程中执行查询对应用程序来说非常沉重。

答案 1 :(得分:0)

我建议将此逻辑从任务转移到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
}

答案 2 :(得分:0)

我可能会对其他建议的答案进行组合,并尝试使用计时器或类似的方法延迟触发SQL语句,但如果用户延迟了足够长的时间来触发SQL,那么请尝试仅过滤从该点向前返回结果(仅当搜索字符串明显变得更具限制性时)。这可以节省您昂贵的SQL往返次数,并在第一次点击后为您提供工作缓存(应该小于您尝试缓存所有内容时)。

希望这有帮助。