我有這樣一個需求,回圈執行2個操作,這2個操作一個是timer定時器,一個是thread。需求是回圈執行這個2個操作。應該怎么寫這個方法呢?使用for回圈執行2個操作,這樣會沒等到操作執行完,回圈就繼續運行了,求大神指點
uj5u.com熱心網友回復:
沒有看懂 你的意思是執行完一個操作之后再執行另一個操作?uj5u.com熱心網友回復:
直接2個都是winform的timer不就好了。還要回圈什么?uj5u.com熱心網友回復:
我現在是這么寫的
for (int i = 0; i < visitorList.Count; i++)
{
Monitor.Enter(obj);
visitor_name = visitorList[i].f_name;
if (isRunNum == 0)
{
//定時器執行
idTimer.enable=true;
if (readIDCardCompleted)
{
WeiDunFingerTool wdTool = new WeiDunFingerTool();
wdTool.featureRegister = featureRegister;
wdTool.showMessage = ShowWndMessageMethod;
wdTool.setParam = SetParamMethod;
wdTool.setVisitorFingerInfo = setVisitorFingerInfoMethod;
wdTool.featureLen = featureLen;
if (!wdTool.OpenDevice())
{
this.rtbFinger.Text = "打開指靜脈設備失敗!";
return false;
}
if (0 != threadrunning)
{
this.rtbFinger.Text = "注冊或驗證執行緒運行中!";
return false;
}
threadrunning += 1;
//執行緒執行
wdTool.RegisterThread();
}
}
但是這樣每次都是內容沒執行完,就繼續回圈了。我這種寫法是不是不對?得怎么寫啊
uj5u.com熱心網友回復:
當我們習慣“未來時態”編程的時候,在看這種代碼就別扭了。好了,這里還沒準備好接受“未來時態”的編程。所以俺們也就不說了,免得那幾個“5年新人”又要噴口水。
很明顯,你用執行緒是因為你不想堵著,你用timer是因為你不知道這個執行緒啥時候結束的。
如果用“未來時態”編程,其實就簡單幾句話,因為他自己就能表示“將來某個時刻我準備好了或者我失敗了”
至于你這里,我只能說。既然結果是異步拿到的,那么直接用異步信號量堵上就行了(去掉所謂的timer,我們已經很煩這里整日整夜的,沒完沒了的,那幾個5年新人的口里的所謂標準答案了-------什么4種timer如何如何)
uj5u.com熱心網友回復:
實際上if (0 != threadrunning)
{
this.rtbFinger.Text = "注冊或驗證執行緒運行中!";
return false;
}
threadrunning += 1;
你這代碼就已經是“信號量”的影子了
uj5u.com熱心網友回復:
幫忙寫個小例子吧,謝謝了
uj5u.com熱心網友回復:
感覺你的Timer用錯地方了,去掉Timer直接Thread.Sleep起到定時的作用,或者將Thread.join(),ManualResetEvent等待執行緒回傳。如果.net版本比較新的話,直接使用Task執行任務,執行任務期間呼叫Wait方法,等待任務完成。uj5u.com熱心網友回復:
private static readonly SemaphoreSlim slim = new SemaphoreSlim(1);
private async void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
await slim.WaitAsync();
Trace.WriteLine("準備進入新執行緒");
RegisterThread();
}
}
void RegisterThread()
{
Thread thread=new Thread(RegisterThread0);
thread.Start();
}
void RegisterThread0()
{
Thread.Sleep(TimeSpan.FromMinutes(1));
Trace.WriteLine("執行緒執行完畢,釋放信號量");
slim.Release();
}
private void button2_Click(object sender, EventArgs e)
{
Trace.WriteLine("測驗信號量是否阻止,主行程運行");
}
這是你現有代碼直接加異步信號鎖,看上去還是很討厭。依舊詭異。而且因為需要異步,所以我還是用了await
下面我在貼,直接“未來時態”代碼,你看是不是比這種詭異代碼看著順眼多了
uj5u.com熱心網友回復:
private async void button1_Click(object sender, EventArgs e){
for (int i = 0; i < 10; i++)
{
await RegisterThread();
}
}
Task RegisterThread()
{
return Task.Run(() =>
{
Trace.WriteLine("進入執行緒");
Thread.Sleep(TimeSpan.FromMinutes(1));
Trace.WriteLine("執行緒執行完畢");
});
}
private void button2_Click(object sender, EventArgs e)
{
Trace.WriteLine("測驗信號量是否阻止,主行程運行");
}
uj5u.com熱心網友回復:
請問這段代碼怎么測驗信號量是否阻止的呢
,這段代碼該怎么理解,我每次按button2都有輸出是不是表示信號量沒阻止
uj5u.com熱心網友回復:
這個需要理解“異步”這個詞,也就是awati/async 這一組詞的含義,這詞表明 “我有個任務給你做,你先去做。我等你做完了通知我,我接著做后面的步驟。同時在你做的程序,我可以做其他的事情”
寫那段代碼是表示紅字的含義。也就是這里整天所謂正確答案“我卡了”----------“開執行緒”,但是我們說其實答案并不是開執行緒,答案其實應該是“異步”,你我可以同時處理多件事情,而不是我同步等著你完成(同步意味著我就等著你完成,這段時間我啥都不做,就等著你)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/24448.html
標籤:C#
