-1

進行状況を報告できる .NET Standard ライブラリがあります。進捗報告メソッドが完了するまで、プログラムがブロックされないようにしたいと思います。代わりに、内部で作業を継続できる Fire-And-Forget パターンが必要ですDoWork()

class Foo
{
   public delegate void ProgressEvent(double progress, double max);
   public ProgressEvent ReportProgress { get; set; }

   public void DoSomeWork()
   {
      for(int i = 0; i < 1000; i ++)
      {
         // Do work
         ReportProgress?.Invoke(i, 1000);   // I do not want to wait for the method to return here
      }
   }
}

これまでは、ReportProgress に割り当てられたメソッド本体が迅速に実行される必要があることを要件として挙げてきました。しかし、優れたコーディング ソリューションがあれば、要件に依存したくありません。

ReportProgress の呼び出しを新しいスレッドでラップする可能性がありますが、それは効率が悪いと思われ、1000 のスレッドが生成されます。

この質問は、クラスで何らかの形で ThreadPool を公開する必要があることを示唆していますが、これが理にかなっているとは確信していません: C# でメソッドを起動して忘れる最も簡単な方法は?

この状況にどのようにアプローチしますか?

編集: クラスのユーザーがこのように使用していると思います。リモート データベースの更新が遅くなる可能性があることに注意してください。この顧客は、私が構造を再考する必要があった理由でした.

void HandleRequest(int requestID)
{
    
    Thread workerThread = new Thread(()=>
    {
        double currentProgress = 0;
        Foo f = new Foo();
        f.ReportProgress = (progress, max) =>
        {
            double newProgress = progress/max;
            if(newProgress > currentProgress)
            {
                currentProgress = newProgress;
                UpdateRemoteDataBase(currentProgress, requestID);
            }
        }
        t.DoWork();
    });
}

4

1 に答える 1

0

DoSomeworkで包むのはどうですかThread

 class Foo
    {
        public delegate void ProgressEvent(double progress, double max);
        public ProgressEvent ReportProgress { get; set; }

        public void DoSomeWork()
        {
            Thread workerThread = new Thread(() =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    // Do work
                    Thread.Sleep(1000);
                    ReportProgress?.Invoke(i, 1000);   // I do not want to wait for the method to return here
                }
            });
            workerThread.Start();
            return;
        }
    }
于 2020-12-04T03:54:46.743 に答える