ボタン付きのWindowsフォームがあります。ボタンをクリックすると、別のクラスでメソッドが開始されます。このメソッドは別のスレッドで開始します。
この class.method が終了すると、Windows フォーム クラスにイベントが発生します。
これが発生すると、別のクラスで別のメソッドを開始し、system.windows.form タイマー (そのクラスで宣言されている) を有効にして処理を開始するように指示します。
しかし、タイマーは開始しません (「tick」イベント内にブレーク ポイントを配置しました)。
コードの開始時に、呼び出しスレッドの外部でタイマーを宣言したためだと思います。
通常、これを使用して同じスレッドでメソッドを呼び出します...
this.invoke(mydelegatename, any pars);
しかし、'this' はクラスで呼び出すことはできません。
これはすべて悪いアーキテクチャに見えることを知っており、タイマーを UI スレッド (Windows フォーム クラス) に移動することで、この問題を簡単に解決できます。
しかし、私は何年も前にこれをどのように行ったかを忘れており、実際には私のコードをカプセル化する試みです.
誰でも私に教えてもらえますか?
ありがとう
コード:
【窓クラス】
_webSync = new WebSync(Shared.ClientID);
_webSync.evBeginSync += new WebSync.delBeginSync(_webSync_evBeginSync);
Thread _thSync = new Thread(_webSync.PreConnect);
_thSync.Start();
private void _webSync_evBeginSync()
{
_webSync.Connect();
}
【WebSyncクラス】
private System.Windows.Forms.Timer _tmrManifestHandler = new System.Windows.Forms.Timer();
public WebSyn()
{
_tmrManifestHandler.Tick += new EventHandler(_tmrManifestHandler_Tick);
_tmrManifestHandler.Interval = 100;
_tmrManifestHandler.Enabled = false;
}
public delegate void delBeginSync();
public event delBeginSync evBeginSync;
public void PreConnect()
{
while (true)
{
if (some condition met)
{
evBeginSync();
return ;
}
}
}
public void Connect()
{
_tmrManifestHandler.Enabled = true;
_tmrManifestHandler.Start();
}
private void _tmrManifestHandler_Tick(object sender, EventArgs e)
{
//NOT BEING 'HIT'
}