如何以 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();
);
【问题讨论】:
试试关键字async
await
@folmerbrem 你有没有考虑过使用IProgress<T>
(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 的形式调用委托调用的主要内容,如果未能解决你的问题,请参考以下文章
以 3D 形式将 CATransformLayer 渲染为 PNG