c#上的单线程队列

时间:2013-06-26 20:44:25

标签: multithreading c#-4.0

我有一个生成事件的用户界面。所以我有一个事件,例如带有参数的“ButtonPressed”。 在事件上我想要解雇耗时的函数“GenerateTableData”。另外我不想阻止界面,所以这个功能应该在后台线程上。 在此之后,我可以将调用传递回主线程并填充列 但是如果用户在按钮上按两次,我不想创建两个线程。相反,我想要中断私有的或者等到它完成并立即启动另一个(单独的按钮用单独的数据填充表格,我们需要仅显示最后一个按下的结果)。

我坚持这个选择。对我来说似乎有用的就是在每个事件上投射背景工作者,但是我不能阻止它执行两次或更多次并且不能排队等待更多事件。

请给我一个解决这个任务的例子,我认为这应该很常见。

这是一些伪代码:

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);
}

1 个答案:

答案 0 :(得分:0)

执行此操作的典型方法是:

  • 对于每个事件类型,应序列化,具有队列
  • 举起一个事件就是将事件排队并踢队(见下文)
  • 在完成任务后,将您的员工包裹在一个方法中
    • 重置“worker is running”标志(不需要锁定)
    • 重新排队

通过“踢队”我的意思是

  • 检查“工作正在运行”标志,如果已设置,则不执行任何操作(结束工作人员将重新启动)
  • 尝试从锁定的队列中出列,如果它是空的,则解锁并且不执行任何操作
  • 所以我们有工作要做:解锁队列之前,设置“工作正在运行”标志