2008-09-17 26 views
1

我的工作與偷看性能要求的項目,所以我們需要批量(批次?)幾個操作(例如持久化數據到數據庫)以提高效率。你知道膨體/成批的流動圖書館爲C#

但是,我想我們的代碼,以保持一個易於理解的流程,如:

input = Read(); 
parsed = Parse(input); 
if (parsed.Count > 10) 
{ 
    status = Persist(parsed); 
    ReportSuccess(status); 
    return; 
} 
ReportFailure(); 

我找這裏已經自動持久化功能()發生散貨(麥角和異步),但對其用戶的行爲就好像它是同步的(用戶應該阻止,直到批量操作完成)。我希望實現者能夠實現Persist(ICollection)。

我看着流爲基礎的編程,與我不是非常熟悉。我在C#here中看到了一個用於fbp的庫,並且與微軟的Workflow Foundation有點相似,但我的印象是,這兩者對於我所需要的都是過度的。你會用什麼來實現膨化流動行爲?

請注意,我想要得到的代碼與我所寫的代碼非常相似(調試易於理解&),所以涉及產量或配置以便將流量彼此連接的解決方案對於我的目的而言是不足的。此外,chaining 是不是我要找的 - 我不想先構建一個鏈然後運行它,我想要的代碼,看起來好像它是一個簡單的流(「做A,做B,如果C然後做D「)。

回答

0

我不知道這是否是你需要的,因爲它是基於sqlserver的,但你有沒有試過看看SSIS和或DTS

+0

不是真的。假設我有PersistBulk()的一些基本功能,它接受大量項目並保持它們(不管低級別的實現)。我想公開一個同步PersistSingleItem()方法。 你的回答並不真正相關,謝謝。 – ripper234 2008-09-17 22:14:11

1

共同的問題 - 而不是調用堅持我通常加載命令(或沿着這些線路SMT)成Persistor類則循環結束後我打電話Persistor.Persist堅持批次。

就在幾個三分球 - 如果您生成SQL命令添加到persistor能以某種方式代表你的查詢(帶內置對象,自定義對象或者只是查詢字符串)。如果您調用存儲過程,則可以使用這些命令將內容附加到一段xml文件中,當您調用persist方法時,它將傳遞給SP。

希望它能幫助 - 相當肯定有這種模式,但不知道名字:)

0

,你可以做一個簡單的事情是建立一個MemoryBuffer,你推的消息簡單地將它們添加到列表,並回報。這個MemoryBuffer有一個System.Timers.Timer被定期調用並執行「實際」更新。

在系統日誌服務器(C#)http://www.fantail.net.nz/wordpress/?p=5中可以找到一個這樣的實現,其中系統日誌消息在批處理中定期記錄到SQL Server。

如果信息被推到數據庫這種方法可能不會好很重要,因爲一旦出了問題,你會失去MemoryBuffer消息。

0

如何使用BackgroundWorker類在單獨的線程上異步保存每個項目?例如:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Threading; 

class PersistenceManager 
{ 
    public void Persist(ICollection persistable) 
    { 
     // initialize a list of background workers 
     var backgroundWorkers = new List<BackgroundWorker>(); 

     // launch each persistable item in a background worker on a separate thread 
     foreach (var persistableItem in persistable) 
     { 
     var worker = new BackgroundWorker(); 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
     backgroundWorkers.Add(worker); 
     worker.RunWorkerAsync(persistableItem); 
     } 

     // wait for all the workers to finish 
     while (true) 
     { 
     // sleep a little bit to give the workers a chance to finish 
     Thread.Sleep(100); 

     // continue looping until all workers are done processing 
     if (backgroundWorkers.Exists(w => w.IsBusy)) continue; 

     break; 
     } 

     // dispose all the workers 
     foreach (var w in backgroundWorkers) w.Dispose(); 
    } 

    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     var persistableItem = e.Argument; 
     // TODO: add logic here to save the persistableItem to the database 
    } 
} 
+1

您是否需要將每個「工作人員」保存在backgroundWorkers中? – beach 2009-05-17 04:00:20