gpt4 book ai didi

.net - 构造函数中的事件处理程序 - 可能还是明智?

转载 作者:行者123 更新时间:2023-12-04 14:06:42 25 4
gpt4 key购买 nike

我有一个对象,它可能需要一秒钟到几分钟的时间来初始化。原因是构造函数从 web 服务中检索数据可能是几千字节到几兆字节,并且根据用户的连接速度,性能可能会有很大差异。出于这个原因,我想将事件放入将处理进度通知。

Here is my question: Can I put event handlers in the constructor or should this type of action be done with a Load method?



例如:
public class MyObject
{
public event EventHandler<UpdateLoadProgressEventArgs> UpdateLoadProgress;

public MyObject(int id)
{
Background worker bgWorker = new BackgroundWorker();
bgWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
//load data and update progress incrementally
UpdateLoadProgress(this, new UpadteLoadProgressEventArgs(progressValue));

Result = someValue;
}
bgWorker.RunWorkAsync();

}

public int Result
{
get;
set;
}

}

但是,当我尝试将事件处理程序绑定(bind)到构造函数时,它们在被调用时始终为空:
MyObject o = new MyObject(1);
o.UpdateLoadProgress += new EventHandler<EventArgs>(o_UpdateLoadProgress);

我假设发生这种情况是因为我在构造函数之后连接了事件。我看到的唯一选择是创建一个 Load 方法来完成构造函数的工作。缺点是使用此类的任何人都必须知道在尝试访问 Result(或任何其他属性)之前调用 Load。

编辑:
这是最终的解决方案:

MyObjectBuilder 类
public class MyObjectBuilder
{
public event ProgressChangedEventHandler ProgressChanged;

public MyObject CreateMyObject()
{
MyObject o = new MyObject();
o.Load(ProgressChanged);

return o;
}
}

MyObject 类
public class MyObject 
{
public int Result { get; set;}

public void Load(ProgressChangedEventHandler handler)
{
BackgroundWorker bgWorker = new BackgroundWorker();
bgWorker.WorkerReportsProgress = true;
bgWorker.ProgressChanged += handler;

bgWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(10);
Result = i;

bgWorker.ReportProgress(i);
}
};
bgWorker.RunWorkerAsync();
}
}

节目类
class Program
{
static void Main(string[] args)
{
MyObjectBuilder builder = new MyObjectBuilder();
builder.ProgressChanged += new ProgressChangedEventHandler(builder_ProgressChanged);

MyObject o = builder.CreateMyObject();
Console.ReadLine();
}

static void builder_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Console.WriteLine(e.ProgressPercentage);
}
}

最佳答案

当然,另一种选择是将事件处理程序也传递给构造函数。

我个人尽量避免在构造函数中做这样的事情。创建一个新对象通常不应该启动后台任务,IMO。您可能希望将其放入静态方法中 - 当然,它可以调用私有(private)构造函数。

您还可以将您的类(class)分成两部分 - 一个准备好一切的构建器(例如事件),然后是一个“正在运行或已完成”的类(class),它有 Result属性(property)。你会调用 Start或在第一个类上类似的东西来获得第二堂课的实例。

关于.net - 构造函数中的事件处理程序 - 可能还是明智?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3405629/

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