2009-08-20 11 views
0

クラス全体でデリゲートを利用できるようにしたいと考えています。これは、外部クラスのbackgroundWorkerから呼び出されたメソッドが、そのメソッド(ExternalClass.Run(); ExternalClass.Method2(); ExternalClass.Method3()などを継続的に報告できるようにすることです。C#クラスでデリゲートを利用できるようにする

私は、デリゲートのインスタンスをグローバルに初期化して、Run()で渡されたインスタンスと等しくなるように設定しようとしましたが、それまでの各メソッドに対してそれに利用できる持っているが、私はnullオブジェクトが暗黙的に変換できないというエラーを与えています。私は私がいないと私が働いているコードを表示することはできません

感謝!

現在私と一緒に持っています(私のラップトップにあります)が、今私はもっと説明しようとします。擬似コード:

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)} 
} 

私は本当にそれを毎回渡すためにしたくないポイントですが、私は何とかあなたがそのあなたのコードが表示されるはずです

+1

説明が明確ではありません。あなたの試行のコードを示してください。 –

+0

BackgroundworkerのReportProgress()メソッドが目標を達成しましたか? – jim

答えて

4

をCLASS2するためにそれを渡したいのですがは動作していません。正確なというエラーメッセージが表示されます。それは問題ないはずですが - ここでは例です:

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

ジョン、どうしてこのためにアップヴォートを手に入れましたか?どのように多くのaltsを持っていますか? – jim

+0

@jim:多少混乱する記述があると、これは変数でデリゲートを保持する方法のかなり簡単なデモであると思いました。なぜそれが役に立たないと思いますか? –

+0

申し訳ありませんジョン、リブのみ。 :)無礼を意図していません。 – jim

0

あなたは労働者が任意のデリゲートを実行できるようにするためにBackgroundWorkerのからは、invokeMethod機能を使用することができ、下記の(例も呼び出しが必要ではない可能性がある、終了するのを待ちます):。

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; 
    } 
} 
関連する問題