0

ボタン付きの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'
}
4

2 に答える 2

2

電話する必要があります_tmrManifestHandler.Start()。有効にするだけでは不十分です。

于 2013-11-07T09:58:15.127 に答える