我有一个生成事件的用户界面。所以我有一个事件,例如带有参数的“ButtonPressed”。在事件中,我想触发耗时的函数“GenerateTableData”。另外我不想阻塞接口,所以这个函数应该在后台线程上。在此之后,我可以将调用传递回主线程并填充列。
但是,如果用户在 Button 上按下两次,我不想创建两个线程。相反,我想打断前一个或等到它完成并立即启动另一个(单独的按钮用单独的数据填充表格,我们只需要显示最后一次按下的结果)。
我被这个选项卡住了。在我看来,所有的工作都是在每个事件上投射 backgroundworker,但我不能阻止它执行两次或更多次,也不能将进一步的事件排队。
请给我一个解决此任务的示例,我认为它应该很常见。
这是一些伪代码:
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);
}