如下需求
有4個任務(a,b,c,d),每一個任務里面有的可能包含啟動Timer去執行別的任務,那么下一個任務必須等上一個任務執行完后才能執行。
比如當前執行a ,a 里面會有一個timer過5秒后啟動執行一個動作,在這個動作里面可能還有一個timer,執行,執行完后再去執行b,b里面
可能也有timer,執行完才能去執行c,而且執行的可能為a,b,c也可能是a,c,d也可能是a,b,d。
uj5u.com熱心網友回復:
加4個等待執行緒不行么?uj5u.com熱心網友回復:
可以使用執行緒,Joinuj5u.com熱心網友回復:
可否具體說說
uj5u.com熱心網友回復:
1、a,b,c,d四個任務是應該是順序執行。可以在a里呼叫了,b里呼叫c,c里呼叫d。2、定義一個標識flag,如a里啟動timer1,標識flag++,timer1執行結束標識flag--。
3、timer1里啟動timer2標識flag++,timer2執行結束標識flag--。
4、while(true){
if(0!=flag) continue;
break;
}
b();
uj5u.com熱心網友回復:
如果每個任務都比較單一,就不用用timer了,直接用執行緒。比如 a,b,c,d 四個執行緒
a.start();
a.join();
b.strart();
b.join();
c.start();
c.join();
d.start();
d.join();
如果每個任務都很復雜,里面還有其它動作,建議你用switch case + timer,這樣的好處是UI不卡。
uj5u.com熱心網友回復:
1.如果要實作執行緒同步的同時,執行緒之間還要有互動,就要用到同步事件。同步事件有兩種:AutoResetEvent和 ManualResetEvent。
它們唯一不同的地方就是在激活執行緒之后,狀態是否自動由終止變為非終止。
2.在執行緒中不推薦再使用timer,
特別是timer的方法如果不可重入,會導致很多問題
使用執行緒池或抽象基本更高的任務比較好
uj5u.com熱心網友回復:
我沒有明白,比如當前執行a ,a 里面會有一個timer過5秒后啟動執行一個動作,在這個動作里面可能還有一個timer,執行,執行完后再去執行b,b里面
可能也有timer,執行完才能去執行c,而且執行的可能為a,b,c也可能是a,c,d也可能是a,b,d。
既然,a執行完,才能執行b,b執行完,才能執行c。那么后面幾種情況是怎么來的?
uj5u.com熱心網友回復:
如果是固定順序,比如a,b,c那么,我覺得就直接是task.wait就好了。
uj5u.com熱心網友回復:
建一個類:一個執行緒,一個忙閑標志(布爾型)創建一個 類的陣列,執行緒啟動,標志忙;結束標志 閑置。
新任務來 ,在陣列中 找閑置 的執行緒 來執行任務。
我曾經做過一個 小工具,從資料庫里拿任務,分配到執行緒中 ,每個執行緒可以處理 一個或者多個任務 。

有可能能解答你的問題。
uj5u.com熱心網友回復:
我這個其實是一個Console程式,之所以可以是a,b,c,d 還可以是a,c,d等等是由用戶輸入的命令列引數決定的。
比如這個
console.exe a b c
console.exe a b c d
console.exe b c d
console.exe b d c a
uj5u.com熱心網友回復:
不是固定順序
uj5u.com熱心網友回復:
用執行緒池就好了。做好一個佇列,第一個加入到執行緒池,執行完,第一個出,最后一個入。就這么簡單。
如果暫時沒有任務,弄一個等待1秒的任務放佇列就可以了。
需要執行 abcd 其中一個任務時, 放到佇列即可。
你唯一要做的事情, 就是維護這個佇列而已。
uj5u.com熱心網友回復:
恩,那你就使用#12的建議,使用一個queue就可以了。
uj5u.com熱心網友回復:
抽象在軟體開發中非常強大。如果一個任務可以抽象為一個ITask,不管那內部什么實作,是否使用Timer,一個ITask必須能夠啟動,回傳時任務保證結束。
那任務排隊不就很簡單了?
public interface ITask
{
string TaskName {get;}
Task RunAsync();
}
假設class A,B,C實作了ITask,程式可以寫成:
class Program
{
static void Main(string[] args)
{
RunTasksAsync("a", "b", "c", "a").Wait(); // RunTasksAsync(args).Wait();
Console.ReadLine();
}
async static Task RunTasksAsync(params string[] taskKeys)
{
var knownTasks = new ITask[] { new A(), new B(), new C() }.ToDictionary(x => x.TaskName);
foreach (var taskKey in taskKeys)
{
if (knownTasks.TryGetValue(taskKey, out var task))
{
Console.WriteLine($"Start >>> {task.TaskName}");
await task.RunAsync();
Console.WriteLine($"Done <<< {task.TaskName}\r\n");
}
}
}
}
uj5u.com熱心網友回復:
從CSDN上看的,就是說要進入下一個下個執行緒,必須等待上個執行緒結束之后才能執行。Join 是一種阻止呼叫執行緒 (即,呼叫該方法的執行緒),直到該執行緒的同步方法其 Join 呼叫方法已完成。 使用此方法以確保執行緒已終止。 如果該執行緒不會終止,呼叫方將無限期地阻止。 在下面的示例中, Thread1 執行緒呼叫 Join() 方法Thread2, ,這將導致 Thread1 到塊,直到 Thread2 已完成。
using System;
using System.Threading;
public class Example
{
static Thread mainThread, thread1, thread2;
public static void Main()
{
mainThread = Thread.CurrentThread;
thread1 = new Thread(ThreadProc);
thread1.Name = "Thread1";
thread1.Start();
thread2 = new Thread(ThreadProc);
thread2.Name = "Thread2";
thread2.Start();
}
private static void ThreadProc()
{
Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
if (Thread.CurrentThread.Name == "Thread1" &&
thread2.ThreadState != ThreadState.Unstarted)
thread2.Join();
Thread.Sleep(4000);
Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
Console.WriteLine("Thread1: {0}", thread1.ThreadState);
Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);
uj5u.com熱心網友回復:
我來卡看看是的所帶的uj5u.com熱心網友回復:
可以把啟用timer放在函式尾部退出前,可以在前面設定好timer,到程式結尾時再啟用。幾個函式都可以這么處理。uj5u.com熱心網友回復:
直接用執行緒就可以啊
uj5u.com熱心網友回復:
小白一枚少時誦詩書uj5u.com熱心網友回復:
如下需求有4個任務(a,b,c,d),每一個任務里面有的可能包含啟動Timer去執行別的任務,那么下一個任務必須等上一個任務執行完后才能執行。
比如當前執行a ,a 里面會有一個timer過5秒后啟動執行一個動作,在這個動作里面可能還有一個timer,執行,執行完后再去執行b,b里面
可能也有timer,執行完才能去執行c,而且執行的可能為a,b,c也可能是a,c,d也可能是a,b,d。
uj5u.com熱心網友回復:
既然不是同時執行,那就一個任務一個函式,先創建一個執行緒,在執行緒里順序呼叫4個任務函式:a();
b();
c();
d();
你可能還有順序的不同,那是根據上一個任務的結果?那就通過每個任務的結果去決定下一個任務的呼叫,比如:
int val = a();
if (val == 0)
val = b();
else
val = c();
后面的執行一樣。
對于某個任務中有timer,那就在任務中等待這個timer執行完后繼續執行就可以了,比如
timer1_task = 1;
startTimer1(); // 在整個timer的任務執行完后,就置timer1_task為0
waitTimerTaskEnd(); // 可以死回圈判斷timer1_task是否為0,如果不為0,就一直回圈
... // 后序任務代碼
對于timer中嵌套timer,也是同樣的方法
uj5u.com熱心網友回復:
可以弄個1-4的隨機整數,對應abcd ,然后隨機決定下一個動作是什么,當然,每執行一個后,要排除對應的亂數。uj5u.com熱心網友回復:
四個執行緒,四個鎖,運行先去判斷鎖。鎖釋放了走執行緒。執行緒完了釋放鎖,然后就是看沖突,沒有沖突就成功uj5u.com熱心網友回復:
也可以使用簡單的delegate,類似于EventHandler,用戶輸入什么,你就 += 到這個delegate然后直接執行delegate就好了,delegate也是一個個按順序執行的
方法應該很多吧
uj5u.com熱心網友回復:
暈了暈了暈了
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/68066.html
標籤:C#
