2009-08-20 45 views
0

我想爲全班授課。關鍵是允許來自外部類「backgroundWorker」的調用方法通過它的所有方法(ExternalClass.Run();)調用ExternalClass.Method2(); ExternalClass.Method3();等等,並且它們都需要發送幾個進度報告看起來效率不高,必須不斷通過代理C#將代理人提供給某個班級

我試着初始化全局委託實例,並將其設置爲等於Run()中傳遞的實例;然後爲每個方法有提供給它,但我給出一個錯誤,一個空的對象不能被隱式轉換。

感謝!

我不能顯示我有,因爲我不工作的代碼目前與我(它在我的筆記本電腦上),但我會盡力現在更好地解釋。僞代碼:

class form1 : form { 
    backgroundWorker_doWork() 
    { 
     Class2.Run(); 
    } 

    backgroundWorker_OnProgressChange() 
    { 
     // do this 
    } 

} 


class class2{ 
    Run(){ 
    OtherMethod();ThirdMethod(); 
    } 

    OtherMethod(){ //need to call backgroundWorker.ReportProcess(int, string)} 
    ThirdMethod(){ //need to call backgroundWorker.ReportProcess(int, string)} 
} 

我真的不希望有通過它的每一個時間點,我想以某種方式把它傳遞給CLASS2

+1

的描述不明確。請顯示您的嘗試代碼。 – 2009-08-20 20:13:01

+0

BackgroundWorker的ReportProgress()方法現在是否可以實現您的目標? – jim 2009-08-20 20:13:44

回答

4

你應該表現出你的代碼,不起作用,並且確切的錯誤消息。它應該是罰款 - 這裏有一個例子:

using System; 

class Demo 
{ 
    private readonly Action action; 

    public Demo(Action action) 
    { 
     this.action = action; 
    } 

    public void FirstMethod() 
    { 
     Console.WriteLine("In first method"); 
     action(); 
    } 

    public void SecondMethod() 
    { 
     Console.WriteLine("In second method"); 
     action(); 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     Demo demo = new Demo(() => Console.WriteLine("Action called")); 

     demo.FirstMethod(); 
     demo.SecondMethod(); 
    } 
} 
+0

喬恩,你是怎麼得到這個讚賞的?你有多少個alt :) – jim 2009-08-20 20:19:02

+0

@jim:給出一個有點令人困惑的描述,我認爲這將是一個相當簡單的如何在變量中保存一個委託的演示。你爲什麼認爲這沒有幫助? – 2009-08-20 20:22:29

+0

對不起喬恩,只有羅紋。 :)沒有不敬的意圖。 – jim 2009-08-20 20:23:47

0

可以使用的InvokeMethod函數從一個BackgroundWorker,讓工人簽署任何委託,下面的例子(還有待調用來完成,你可能不需要):

BackgroundWorker的功能(C++淨)

BackgroundWorkerFunction() 
{ 
::IAsyncResult ^ThreadResult; 

SetTileCount_Delegate ^SetCountDel = gcnew SetTileCount_Delegate(this, &PartDetail::SetTileCount_Function); 

//RecordingContainer is the class I am invoking into 
ThreadResult = this->RecordingContainer->BeginInvoke(
    SetCountDel, ThisTest->RecordingsCache->Count); 

WaitForInvokeTimeOutOrCompletion(ThreadResult); 
} 




System::Void WaitForInvokeTimeOutOrCompletion(IAsyncResult ^ThreadResult) 
{ 
    if(ThreadResult == nullptr) return; 

    long SleepTotal = 0; 
    long SleepInterval = 100; 

    while ((SleepTotal <= 2000) && !ThreadResult->IsCompleted) 
    { 
     ThreadResult->AsyncWaitHandle->WaitOne(SleepInterval, false); 
     SleepTotal += SleepInterval; 
    } 
}