C # Обеспечение доступности делегата для класса - PullRequest
0 голосов
/ 21 августа 2009

Я хотел бы сделать делегата доступным для всего класса. Смысл этого состоит в том, чтобы позволить вызываемому методу из внешнего класса backgroundWorker постоянно отчитываться через все его методы (ExternalClass.Run (); вызывает ExternalClass.Method2 (); ExternalClass.Method3 () и т. Д., И все они нуждаются отправлять несколько отчетов о ходе выполнения. Кажется неэффективным постоянно пропускать делегата.

Я попытался инициализировать экземпляр делегата глобально и установить его равным переданному экземпляру в 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

Ответы [ 2 ]

4 голосов
/ 21 августа 2009

Вы должны показать свой код, который не работает, и сообщение об ошибке точный . Это должно быть хорошо - вот пример:

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 голосов
/ 27 августа 2009

Вы можете использовать функцию InvokeMethod из backgroundWorker, чтобы позволить работнику выполнить любой делегат, пример ниже (также ожидает завершения вызова, который вам может не понадобиться):

Функция 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;
    }
}
...