gpt4 book ai didi

c# - 使用 EventArgs 中的可写属性向事件调用者提供反馈

转载 作者:行者123 更新时间:2023-11-30 17:58:00 25 4
gpt4 key购买 nike

在 Dustin Campbell 的问题回答中 Return a value from a Event — is there a Good Practice for this?据称,我们可以在一组传递给事件的自定义 EventArgs 上设置可写属性,而不是从事件处理程序返回数据,类似于 WinForms FormClosing 事件的 Cancel 属性。 p>

如何使用 EventArgs 中的属性向事件调用方提供反馈?

我的具体情况是有一个 Controller 类执行Job A,并且有许多类请求完成Job A。因此, Controller 在所有类上都订阅了该事件。

我想向来电者提供一些工作已完成的反馈。棘手的部分是这些类是模块类的, Controller 对它们一无所知。

我的想法是将可写属性包含到事件的委托(delegate)中,以便 Controller 通过它提供反馈。可以使用反射以某种方式调用此属性,这在我的场景中很好。

最佳答案

您不能为委托(delegate)定义属性。此外,您不需要对这种机制进行反射(reflection)。您要做的是在 EventArgs 派生类中定义“返回”属性。

一个简单的这样的类是:

public class JobEventArgs : EventArgs {
public bool Done { get; set; }
}

现在您可以在类中将您的事件声明为

public event EventHandler<JobEventArgs> Job;

在处理事件的方法中的用法:

public void DoJob(object s, JobEventArgs args) {
// do stuff
args.Done = true;
}

并在事件调用代码中:

public void FireJobEvent() {
var args = new JobEventArgs();

this.Job(this, args);

if(!args.Done) {
// the job was not handled
}
}

但坦率地说,您似乎更希望在工作完成时通过通知异步完成工作。

这会导致类似...的语法

class Module {
public void JobCompleted(IAsyncResult r) {
if(!r.IsCompleted)
return;

Console.WriteLine("The job has finished.");
}

public void ExecuteJob() {
var job = new EventArgs<JobEventArgs>((s, a) => { this.controller.JobA(); });
job.BeginInvoke(null, null,
r =>
{
this.JobCompleted(r);
if(r.IsCompleted)
job.EndInvoke(r);
}, null);
}
}

关于c# - 使用 EventArgs 中的可写属性向事件调用者提供反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12778689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com