1

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

在我的 winforms 代码中使用 Tasks 过去很简单。

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

  • 像往常一样创建一个线程但是该事件将在text changed上。

我遇到的问题是考虑逻辑,如果我只是更改事件,我看不到这个工作,因为用户键入的速度可能比代码运行的速度快(在这种情况下是一个 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();
}

正如你所看到的简单的东西,但简单的变化事件似乎把整个逻辑搞砸了。

4

3 回答 3

0

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

于 2013-03-26T14:07:24.437 回答
0

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

希望这可以帮助。

于 2013-03-26T17:06:52.837 回答
0

我建议将此逻辑从任务移动到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
}
于 2013-03-26T14:09:15.640 回答