使用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();
}
正如你可以看到简单的东西,但简单的变化事件似乎弄乱了整个逻辑。
答案 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往返次数,并在第一次点击后为您提供工作缓存(应该小于您尝试缓存所有内容时)。
希望这有帮助。