【发布时间】:2011-08-11 23:42:30
【问题描述】:
我有许多做事的类,通常单步执行一个记录集并为每条记录调用一个或两个 Web 服务。
目前这一切都在 GUI 线程中运行并挂起绘画。第一个想法是使用 BackgroundWorker 并实现一个漂亮的进度条、处理错误、完成等。Background Worker 启用的所有好东西。
代码一进入屏幕就开始闻起来。我在每个类中编写了很多后台工作程序,在 bw_DoWork 方法中重复了大部分 ProcessRows 方法,并认为应该有更好的方法,而且可能已经完成了。
在我开始重新发明轮子之前,是否有一个模式或实现用于分离后台工作人员的类?它需要实现接口(如 ibackgroundable)的类,但这些类仍然可以独立运行,并且只需要极少的更改即可实现接口。
编辑:@Henk 要求的简化示例:
我有:
private void buttonUnlockCalls_Click(object sender, EventArgs e)
{
UnlockCalls unlockCalls = new UnlockCalls();
unlockCalls.MaxRowsToProcess = 1000;
int processedRows = unlockCalls.ProcessRows();
this.textProcessedRows.text = processedRows.ToString();
}
我想我想要:
private void buttonUnlockCalls_Click(object sender, EventArgs e)
{
UnlockCalls unlockCalls = new UnlockCalls();
unlockCalls.MaxRowsToProcess = 1000;
PushToBackground pushToBackground = new PushToBackground(unlockCalls)
pushToBackground.GetReturnValue = pushToBackground_GetReturnValue;
pushToBackground.DoWork();
}
private void pushToBackground_GetReturnValue(object sender, EventArgs e)
{
int processedRows = e.processedRows;
this.textProcessedRows.text = processedRows.ToString();
}
我可以继续这样做,但不想重新发明。
我正在寻找的答案类似于“是的,乔做了一个很好的实现(这里)”或“这是一个代理小部件模式,去阅读它(这里)”
【问题讨论】:
-
也许添加一个小(简化)示例?
-
已添加,在此示例中,UnlockCalls 使用 SQL 语句抓取多达 1000 行,使用 Web 服务神奇地解锁每一行,并返回它处理的行数。我还想在 pushToBackground 类中实现/使用取消和进度功能。
标签: c# multithreading backgroundworker