正如你所看到的,我有兩個類。 RfidReaderHardware在線程「th」中生成事件,但在另一個線程上運行Form。正如你所看到的那樣,如果使用ListViewControl的Invoke方法。所以,問題是如何更改RfidReaderHardware來解決封裝問題。如何正確封裝多線程.NET C#
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); }));
}
}
我認爲,開發商不應該想怎麼另一個類的作品。這就是理由,爲什麼我做這件事。奇怪的定義你被發現:)。我瞭解一對多的關係,但有什麼區別? –
@NikolayChernov我可以很容易地爲你提供漢斯發佈的內容,但是從OOP的角度來看它是錯誤的,因爲它違反了SR(單一責任)原則。事件來源是提高事件。所以我留在我的答案。你的問題是關於封裝原則,如果你只想自動在另一個線程上分派事件,你不應該這樣制定它。 –