我想我现在的逻辑有些问题。
我使用阻塞集合对其他 PC 进行线程安全调用。一般来说,它看起来像这样:
public class MyClass
{
private BlockingCollection<workUnit> workUnits = new BlockingCollection<workUnit>();
public void EnQueue(workUnit item)
{
workUnits.Add(item);
}
private void DeQueue()
{
while (!stopFlag)
{
workUnit item = workUnits.Take();
DoLongRunningDBStuff(workUnit);
}
}
}
现在我想将其可视化给用户。
用户应该看到
- 项目在队列中
- 项目处理已开始
- 处理结果(主要是通过/失败/异常)
现在我有些头疼。
我正在考虑执行以下操作:
有一个网格来向用户显示项目。
- 如果 item 已入队,则将其添加到 workunits 并另外添加到绑定到 datagrid 的列表中
- 如果项目已出列(已使用),则更新网格列表中的项目。
令人头疼的是,如何使这个线程安全,以及需要哪些部分是线程安全的。
如果我把一些需要时间的东西放在 workUnit.Add 后面,我认为这是可能的,那么数据就会混合在一起。
这样的事情可行吗?
- 如果项目已入队,则将其添加到工作单元和 UI 的附加 BlockingCollection
- 如果项目已出列,请尝试 2.BlockingCollection 并将其删除,更新状态并再次将其附加到第二个列表。
我需要在 1 和 2 附近加锁吗?如果是这样,如果等待Take,它不会完全阻止添加吗?
是否有一个简单的解决方案或方法来可视化,发生了什么?