これは WinForms C# アプリケーションです。次の 2 つのスニペットは、オブジェクトを初期化する 2 つの異なる方法を示しています。それらは異なる結果をもたらしています。
これは期待どおりに機能します。
public partial class Form1 : Form
{
private CameraWrapper cam;
public Form1()
{
cam = new CameraWrapper();
InitializeComponent();
}
これは機能しません (詳細は以下):
public partial class Form1 : Form
{
private CameraWrapper cam = new CameraWrapper();
public Form1()
{
InitializeComponent();
}
内部CameraWrapper
では、サードパーティの SDK を使用してカメラと通信しています。結果が利用可能になったときに呼び出される SDK のイベントに登録します。
ケース 1 (コンストラクター内の初期化) では、すべてが期待どおりに機能し、内部のイベント ハンドラーCameraWrapper
が呼び出されます。ケース 2 では、イベント ハンドラーは呼び出されません。
これら 2 つのオブジェクト初期化スタイルは同じだと思っていましたが、そうではないようです。なんで?
CameraWrapper
これがクラス全体です。イベント ハンドラは、 への呼び出しの後に呼び出される必要がありますTrigger
。
class CameraWrapper
{
private Cognex.DataMan.SDK.DataManSystem ds;
public CameraWrapper()
{
ds = new DataManSystem();
DataManConnectionParams connectionParams = new DataManConnectionParams("10.10.191.187");
ds.Connect(connectionParams);
ds.DmccResponseArrived += new DataManSystem.DmccResponseArrivedEventHandler(ds_DmccResponseArrived);
}
public void Trigger()
{
SendCommand("TRIGGER ON");
}
void ds_DmccResponseArrived(object sender, DmccResponseArrivedEventArgs e)
{
System.Console.Write("Num barcodes: ");
System.Console.WriteLine(e.Data.Length.ToString());
}
void SendCommand(string command)
{
const string cmdHeader = "||>";
ds.SendDmcc(cmdHeader + command);
}
}