0
我有一个生成事件的用户界面。所以我有事件例如“ButtonPressed”与参数。 关于事件我想引发耗时的函数“GenerateTableData”。我也不想阻塞接口,所以这个函数应该在后台线程上。 在此之后,我可以将调用传递回主线程并填充列。
但是,如果用户在按钮上按两次,我不想创建两个线程。相反,我想打断这个私密的人,或者等到它完成并立即开始另一个(单独的按钮用单独的数据填充表格,我们只需要显示最后一个按下的结果)。c上的单线程队列#
我被这个选项卡住了。所有对我来说都很有用的工作是在每个事件上投入背景工作,但我无法阻止它执行两次或更多次,也无法排队进一步事件。
请给我一个解决这个任务的例子,我认为它应该很常见。
下面是一些伪代码:
void Button1Pressed(args)
{
DoWork(1);
}
void Button2Pressed(args)
{
DoWork(2);
}
void DoWork(int i)
{
BackGroundWorker bg=new BackGroundWorker();
bg.DoWork+= (object sender, DoWorkEventArgs e) => {e.result=GenerateTable(i)};
bg.RunWorkerCompleted+= (object sender, RunWorkerCompletedEventArgs e) =>{InvokeOnMainThread(()=>{PopulateColumns(e.result)})};
bg.RunWorkerAsync();
}
void PopulateColumns(data)
{
myTable.PopulateWithData(data);
}
什么是更好的方式来组织队列?列表还是smth? –
无论最合适 - 我通常使用System.Collections.Generic.Queue(http://msdn.microsoft.com/en-us/library/7977ey2c.aspx) –
谢谢。一整天都在尝试创建解决方案,并一直努力重现错误。问题是在内部方法中读取SQLite不是线程安全的。最后,我明白了,现在没问题。 –