如何以 Fire-And-Forget 的形式调用委托调用

Posted

技术标签:

【中文标题】如何以 Fire-And-Forget 的形式调用委托调用【英文标题】:How to invoke a delegate call as Fire-And-Forget 【发布时间】:2021-03-14 04:01:57 【问题描述】:

我有一个能够报告其进度的 .NET Standard 库。我希望程序在进度报告方法完成之前阻止。相反,我想要一个即发即弃的模式,工作可以在 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,但我不确定这是否有意义: Simplest way to do a fire and forget method in 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();
    );


【问题讨论】:

试试关键字asyncawait @folmerbrem 你有没有考虑过使用IProgress&lt;T&gt; (1)? @MichaelMao 是的,我正在研究异步模式,因为它确实看起来像是要走的路。但是在使用委托时,我很难将其放入我的上下文中。如果您能抽出一点时间,举个例子真的很有帮助。 你能举例说明你将如何使用这个类 @MichaelMao 我添加了一个可能代表客户如何使用库的代码 【参考方案1】:

Thread包裹你的DoSomework怎么样

 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;
        
    

【讨论】:

以上是关于如何以 Fire-And-Forget 的形式调用委托调用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 HSQLDB 表列中以字符串形式保存 XML 数据

RabbitMQ4--发后即忘和RPC

以 3D 形式将 CATransformLayer 渲染为 PNG

以 onsubmit 形式调用 ajax 函数 [重复]

如何从数据库中获取图像并在 laravel 中使用 ajax 以编辑形式预览它?

Ajax 调用总是以未定义的形式返回并且没有到达后面的代码