我有一個要求,使用SqlBulkCopy將大型csv文件分成幾個不同的數據庫插入。我打算通過兩個單獨的任務來完成此任務,1個用於批量處理CSV文件,另一個用於插入數據庫。作爲一個例子,這裏是我的事情:具有容錯功能的並行生產者/消費者?
public class UberTask
{
private readonly BlockingCollection<Tuple<string,int>> _store = new BlockingCollection<Tuple<string, int>>();
public void PerformTask()
{
var notifier = new UINotifier();
Task.Factory.StartNew(() =>
{
for (int i =0; i < 10; i++)
{
string description = string.Format("Scenario {0}", i);
notifier.PerformOnTheUIThread(() => Console.WriteLine(string.Format("Reading '{0}' from file", description)));
// represents reading the CSV file.
Thread.Sleep(500);
notifier.PerformOnTheUIThread(() => Console.WriteLine(string.Format("Enqueuing '{0}'", description)));
_store.Add(new Tuple<string, int>(description, i));
}
_store.CompleteAdding();
});
var consumer = Task.Factory.StartNew(() =>
{
foreach (var item in _store.GetConsumingEnumerable())
{
var poppedItem = item;
notifier.PerformOnTheUIThread(() => Console.WriteLine(string.Format("Sending '{0}' to the database", poppedItem.Item1)));
// represents sending stuff to the database.
Thread.Sleep(1000);
}
});
consumer.Wait();
Console.WriteLine("complete");
}
}
這是配對2套相關任務的好方法嗎?什麼上面的代碼不處理(它需要):
- 如果表示CSV讀取故障的任務,其他任務需要停止
- (即使仍然存在_Store項目。)如果表示數據庫的任務插入錯誤,則其他進程可以停止處理。
- 如果配對任務中的任何一個出現故障,我將需要執行一些操作來回滾數據庫更新(我不擔心如何回滾),這更多的是如何編碼「發生故障配對任務之一,所以我需要做一些整理「。
以上任何幫助將不勝感激!
感謝您的詳細回答阿德! – primalgeek 2011-04-16 08:56:39