創建Task任務的方法
// 法一
var tf = new TaskFactory();
var t_a = tf.StartNew(() => Console.Write("create a task"));
// 法二
Task.Factory.StartNew(() => Console.Write("create a task"));
// 法三
Task.Run(() => Console.Write("create a task"));
// 法四
var t = new Task(() => Console.Write("create a task"));
t.Start();
// 集合用法
List<Task> list = new List<Task>();
list.Add(Task.Run(() => strResult = GetString("aaa")));
list.Add(Task.Run(() => myInt = GetInt(0)));
list.Add(Task.Run(() => GetVoid()));
帶返回值的Task
Task<int> task = new Task<int>(a => { return (int)a + 1; }, 1);
task.Start();
Console.WriteLine(task.Result); //task.Result 獲取返回值
Taske的WaitAll()方法,主線程等待WaitAll()參數內的所有線程執行完,會卡住頁面,與WaitAll相近的方法還有 Wait(Int32) 和 Wait(TimeSpan) 方法阻止調用線程,WaitAny() 表示等待某個或多個Task執行完成
DateTime startTime = DateTime.Now; // Task開始時間
List<Task> list = new List<Task>();
list.Add(Task.Run(() => myInt = GetInt(10)));
list.Add(Task.Run(() =>
{
Console.Write("事物開始!");
DateTime outTime = DateTime.Now.AddSeconds(20); // 設置超時時間爲20S
bool bls = true;
while (!(list[0].IsCompleted)) // 判斷Task[0]是否完成
{
if (DateTime.Now > outTime) // 判斷是否超時
bls = false;
}
DateTime sTime = startTime; // Task運行開始時間
DateTime endTime = DateTime.Now; // Task運行結速時間
if (bls)
Console.Write("所有Task成功任務已完成,提交事物!");
else
Console.Write("所有Task任務失敗----超時----已結束,回滾事物!");
}));
// var a Task.Run(() => strResult = GetString("aaa"));
// var b=Task.Run(() => strResult = GetString("bb"));
// Task.WaitAll(a,b); // 推薦用這種
Task.WaitAll(list.ToArray());
使用變量對Task方法結果賦值,保證頁面不卡ContinueWith()方法,同時取前Task的變量值來處理
string strResult = "";
int myInt = 0;
// 集合用法 不推薦,更推存var tss = new Task(()=> strResult=GetString("bbb")這種寫法
List<Task> list = new List<Task>();
list.Add(Task.Run(() => strResult = GetString("aaa"))); // 給 strResult在Task中賦值
list.Add(Task.Run(() => myInt = GetInt(0))); // 給 myInt在Task中賦值
list.Add(Task.Run(() => GetVoid()));
list[2].ContinueWith(task => // ContinueWith()延續任務 指Task完成第一個任務再下延續任務
{
bool bls = true;
Console.Write(strResult + myInt); // 對變量strResult和myInt操作
DateTime outTime = DateTime.Now.AddSeconds(5); // 設置超時時間
while (!list[0].IsCompleted || !list[1].IsCompleted) // 判斷這兩個任務是否執行完?
{
if (DateTime.Now > outTime) // 判斷是否超時
bls = false;
}
if (bls)
Console.Write("方案成功執行,提交事物!");
else
Console.Write("方案執行失敗,超時,回滾事物!");
});
有反回值的Task,通過Result 屬性獲取Task的返回值
Task<string> tasks = Task.Factory.StartNew<string>(() => {return GetString("ccc"); });
string aaa = tasks.Result;
Task<string> ts =new Task<string>(()=> {
while (!tasks.IsCompleted) // 判斷tasks是否執行完成
{ }
return GetString("ccc") +" "+ tasks.Result; // 通過tasks.Result獲取tasks的返回值
});
ts.Start();
string stsssssr = ts.Result; // 通過ts.Result 獲取ts的返回值
Console.Write(stsssssr);
使用單獨線程的任務
如果任務的代碼需要運行很長時間,就應該使用TaskCreationOptions.LongRunning告訴任務調度器創建一個新線程,而不是使用線程池中的線程。此時線程可以不由線程池管理。當線程來自線程池時,任務調度器可以決定等待已經運行的任務完成,然後使用這個線程,而不是在線程池中創建一新的線程。對於長時間運行的線程,任務調度器會立即知道等待他們完成不是明智做法。
Task<string> tasks = Task.Factory.StartNew<string>(() => {return GetString("ccc"); }, TaskCreationOptions.LongRunning);
string aaa = tasks.Result;
Task<string> ts =new Task<string>(()=> {
while (!tasks.IsCompleted)
{ }
return GetString("ccc") +" "+ tasks.Result; // 通過tasks.Result獲取tasks的返回值
}, TaskCreationOptions.LongRunning);
ts.Start();
string stsssssr = ts.Result; // 通過ts.Result 獲取ts的返回值
Console.Write(stsssssr);