0

クラス全体でデリゲートを利用できるようにしたいと思います。これのポイントは、外部クラスのbackgroundWorkerから呼び出されたメソッドが、そのすべてのメソッド(ExternalClass.Run();呼び出しExternalClass.Method2(); ExternalClass.Method3();などを継続的に報告できるようにすることです。いくつかの進捗レポートを送信するために。継続的に代理人を通過しなければならないのは非効率的です。

デリゲートのインスタンスをグローバルに初期化し、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)}
} 

毎回渡す必要はないので、なんとかしてclass2に渡したいです。

4

2 に答える 2

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();
    }
}
于 2009-08-20T20:14:18.763 に答える
0

以下の例のように、backgroundWorker から InvokeMethod 関数を使用して、ワーカーが任意のデリゲートを実行できるようにすることができます (呼び出しが終了するのも待機しますが、これは必要ない場合があります)。

BackgroundWorker 関数 (C++.net)

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;
    }
}
于 2009-08-27T14:34:11.050 に答える