おはよう。私はそこの提案を試みた、そしてそれは部分的に私の問題を解決しResetting Threading Timer if it's called a second timeC#restarting Threading.TimerでChangeが初期タイマーインスタンスを停止しない
:
私の質問は、この投稿への(種類の)フォローアップです。
私は4つのThreading.Timersを含むC#アプリケーションを持っています。
要約:2つのスレッドは2時間ごとに実行され、1つのスレッドは1回だけ実行され、1つのスレッドは1分ごとに実行されます。 4つのスレッドすべてがListBox(lstMonitor)に更新をポストします。 lstMonitorをクリアするボタンもあり、4つのスレッドをすべて再起動する必要があります。
public partial class FullSynchro : Form
{
public System.Threading.Timer TimerReference;
public bool TimerCanceled;
readonly TimeSpan tsTwo = new TimeSpan(2, 0, 0);
TimeSpan tickTwo = new TimeSpan(2, 0, 0);
TimeSpan tickOne = new TimeSpan(2, 0, 0);
readonly TimeSpan tsFour = new TimeSpan(0, 1, 0);
TimeSpan tickFour = new TimeSpan(0, 1, 0);
System.Threading.Timer thSyncTwo, thSyncOne, thSyncThree, thSyncFour;
public delegate void InvokeDelegate(string input);
FullSynchro objOne, objTwo, objThree, objFour;
TimerCallback tcbOne, tcbTwo, tcbThree, tcbFour;
public FullSynchro()
{
InitializeComponent();
}
private void FullSynchro_Load(object sender, EventArgs e)
{
/* instantiating the class that gets called by the Timer. */
objOne = new FullSynchro();
tcbOne = new TimerCallback(PerformSyncOne);
/* instantiate the Timer object */
thSyncOne = new System.Threading.Timer(tcbOne, objOne, 0, Timeout.Infinite);
objOne.TimerReference = thSyncOne;
objTwo = new FullSynchro();
tcbTwo = new TimerCallback(PerformSyncTwo);
thSyncTwo = new System.Threading.Timer(tcbTwo, objTwo, 0, Timeout.Infinite);
objTwo.TimerReference = thSyncTwo;
/* one-time Sync */
objThree = new FullSynchro();
tcbThree = new TimerCallback(PerformSyncThree);
thSyncThree = new System.Threading.Timer(tcbThree, objThree, 0, 0);
objThree.TimerReference = thSyncThree;
objFour = new FullSynchro();
tcbFour = new TimerCallback(PerformSyncFour);
thSyncFour = new System.Threading.Timer(tcbFour, objFour, 0, Timeout.Infinite);
objFour.TimerReference = thSyncFour;
}
void PerformSyncOne(object StateObj)
{
//code goes here
}
void PerformSyncTwo(object StateObj)
{
//code goes here
}
void PerformSyncThree(object StateObj)
{
//code goes here
}
void PerformSyncFour(object StateObj)
{
//code goes here
}
private void btnOverride_Click(object sender, EventArgs e)
{
if (Message.Show("Are you sure you wish to restart Sync?", this.Text) == DialogResult.Yes)
{
thSyncTwo.Change(0, 0);
//lstMonitor.Items.Clear();
//PerformSync();
}
}
}
ボタンコードが正常に機能しました。 thSyncTwo.Change()
は最初からPerformSyncTwo()
を実行しましたが、PerformSyncTwo()
の最初のインスタンスはlstMonitorへの更新のポスティングを継続していました。
私はWaitHandle
の使用について読んだことがありますが、動作させることはできません。私はDispose()
を使用してみましたが、ほとんどすべてのスレッド関連のコードですが、Timerの最初のインスタンスはまだ実行中です。私は本当にそれらのタイマーの前のインスタンスを「殺す」必要があり、その後それらを "復活"させる必要があります。
だから可能ですか?あるいは私は別の種類のタイマーを使うべきですか?
あなたはフォームFullSynchroを持っていますが、そのフォームの読み込みにはフォームのコピーを4つ作成します。フォームは4つずつコピーします。 – BugFinder
4タイマー単一の(通常は量子化された「動作中のスレッド」の形で)使用することができ、マルチスレッドは定義により複雑になります。この方法では、同期オブジェクトは必要ありませんが、通常の状態オブジェクト(同じスレッドで変更されます)が必要です。 – Sinatr
@BugFinderええ、なぜ私はそれをそのように設計したのか覚えていません。このアプリケーションは4歳以上で、正常に動作しています。スレッドを再起動するボタンは、クライアントから要求された新しい拡張機能です。私はそれらを削除して、アプリケーションが正常に動作し続けることができるかどうかを確認します。 –