gpt4 book ai didi

c# - 如何正确封装多线程.NET C#

转载 作者:太空宇宙 更新时间:2023-11-03 12:56:53 26 4
gpt4 key购买 nike

如您所见,我有两个类。 RfidReaderHardware 在线程“th”中生成事件,但 Form 在另一个线程中运行。如您所见,在窗体中使用 ListViewControl 的 Invoke 方法。所以,问题是如何改变RfidReaderHardware来解决封装问题。

public class RfidReaderHardware : IDisposable
{
public event EventHandler<RfidReaderEventArgs> OnNewPackage;
Thread th;
//This method will be called from thread "th"
private void FireNewPackageEvent(UHFPackage package)
{
... code ...
}
... some code ...
}

我们有示例代码,其中使用了此事件

public partial class PassageForm : Form
{
RfidReaderHardware RfidReader = new RfidReaderHardware(...);

private void Form1_Load(object sender, EventArgs e)
{
RfidReader.OnNewPackage += NewRfidPackage;
}
//not sure, but i think it's running in thread "th"
private void NewRfidPackage(Object o, RfidReaderEventArgs e)
{
ListViewItem item = new ListViewItem();
//from point of encapsulation view it's wrong as you know
CPackageList.Invoke(new Action(() => {CPackageList.Items.Add(item); }));
}
}

最佳答案

question is how to change RfidReaderHardware to resolve encapsulation problem

其实不存在封装问题。根据定义,事件源和订阅者之间的关系是一对多的,因此事件源不能“封装”特定订阅者的逻辑。订阅者可以选择如何处理通知。可以忽略它,或立即处理它,或者像您的情况一样在 UI 线程上同步(使用 Control.Invoke)或异步(使用 Control.BeginInvoke)处理它).

关于c# - 如何正确封装多线程.NET C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33581627/

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