2011-08-31 97 views
0

不知道標題是否涵蓋了該問題,但是它出現了。C#共享Classlib - >向webforms和/或控制檯顯示進度應用程序

我有一個項目:

  • 一個網站:web表單(Aps.net 4,C#),用戶可以上傳文件,與它們進行交互和手動觸發一些批處理
  • 一個CLASSLIB與處理的所有業務邏輯
  • 在客戶位置的計算機上運行的應用程序,計劃通過SFTP將文件上載到我們的服務器。
  • 在服務器上計劃的控制檯應用程序,並對由SFTP上載的文件執行批處理。

'重用客戶'使用SFTP應用程序,其他人使用該網站。

控制檯應用程序和網站都使用相同的classlib。

我可以使用什麼機制將日誌/進度信息發送到網站或控制檯應用程序,而無需實施兩個classlib?我不希望classlib知道它是由控制檯應用程序或網站調用的。例如,他們也共享相同的設置。等等。

有什麼想法?

回答

0

活動。

您可以將事件添加到在共享庫中執行實際業務邏輯的類。當發生需要反饋的事情時,您可以在課堂上提出該事件。

消費應用程序(控制檯應用程序或Web應用程序)可以訂閱這些事件,並採取特定於其平臺的適當操作。

一個非常simplyfied例如:

public class SomeLogicClass 
{ 
    public event EventHandler SomethingDone; 

    protected virtual void OnSomethingDone() 
    { 
     if(SomethingDone != null) 
     { 
      SomethingDone(this, EventArgs.Empty); 
     } 
    } 

    public void DoSomething() 
    { 
     // Do some work. 
     OnSomethingDone(); 
    } 
} 

在您的控制檯應用程序,你可以做到這一點,例如:

var x = new SomeLogicClass(); 
x.SomethingDone += (s,e) => Console.WriteLine ("Work done."); 
x.DoSomething(); 
+0

舉動共享庫在自己的線程所做的工作,你有最好的後臺工作的解決方案和解決方案的事件都沒有你的lib綁定到一個BackgroundWorker對象。但要小心使用線程時增加的複雜性! –

+0

Offcourse,可以在另一個線程上執行businesslogic。但是,這會帶來一些額外的工作,因爲您要確保事件處理程序在正確的上下文中執行。 :) –

+0

所以你想要一個進度報告事件處理程序在同一個線程中運行呢?因此,如果像在這種情況下該進度報告是關於通過http發送數據一樣,您想同時阻止這項工作?這裏的標準是在執行期間報告進度/日誌,而不是在執行之後。 – edvaldig

0

的活動思路解決不了任何問題,因爲它會阻止主線程和如在響應式用戶界面中報告進度不太有用。

使用的BackgroundWorker:

public static void Main(string[] args) 
    {   
     BackgroundWorker worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 
     worker.ProgressChanged += ReportProgress; 
     worker.RunWorkerCompleted += ProgressComplete; 
     worker.DoWork += DoWork; 
     worker.RunWorkerAsync(); 
    } 

    private static void DoWork(object sender, DoWorkEventArgs doWorkEventArgs) 
    { 
     //Runs on seperate thread 
     //Do stuff 
     //(sender as BackgroundWorker).ReportProgress... reports back to main thread 
     //Do other stuff 
    } 

    private static void ProgressComplete(object sender, RunWorkerCompletedEventArgs e) 
    { 
     //Executed on main thread 
     Console.Out.WriteLine("All Done"); 
    } 

    private static void ReportProgress(object sender, ProgressChangedEventArgs e) 
    { 
     //Can be used to asynchronously send status updates or update UI elements on the main thread 
     Console.Out.WriteLine("{0:P} done", e.ProgressPercentage/100.0); 
    } 
+0

我想提一下,背景工作者也會使用事件來與調用者進行溝通。 BackGroundWorker只是一些實現,你可以在BL類中使用*來確保你的邏輯在另一個線程上執行(如果你願意的話),但是BackgroundWorker並不是唯一的解決方案。 –

+0

這不是我的觀點,重要的是事件本身並不能解決這個問題。使用BackgroundWorker或Thread/Task在單獨的線程上完成一些工作,然後讓另一個線程完成報告。例如,當進度報告功能通過tcp管道發送數據時,阻止作業沒有任何意義。事件只是一種溝通方式 – edvaldig