[英]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.