想計算多執行緒執行方法的時間,但是一直無法實作,一下是我的代碼,請大神指點幫忙,謝謝!
uj5u.com熱心網友回復:
測時方法可以放在doTestThread里面。uj5u.com熱心網友回復:
doTestThread方法是執行緒體,當doTestThread執行完畢執行緒就執行完了,sw計時doTestThread就是執行緒運行的時間~uj5u.com熱心網友回復:
有辦法計算所有執行緒從開始一直到結束所花費的時間嗎?uj5u.com熱心網友回復:
考慮使用 Task,Task 是執行緒封裝的一種類,Task.Wait 會等待指定的任務全部執行完畢,這時就可以計算總的執行時間了。uj5u.com熱心網友回復:
注意:Task 類是 .Net 4.0 引入的,早期版本不支持。uj5u.com熱心網友回復:
意思是用task包住Thread執行嗎?uj5u.com熱心網友回復:
WaitHandle.WaitAll()關鍵字給你,自己研究一下
uj5u.com熱心網友回復:
我有點亂了~各位大神能都給我簡單講解一下 ` 我需要的效果是, 同時執行多個執行緒,從開始的那一刻開始計時,一直到最后一個執行緒結束的時間。是否也可以這樣理解,在每個執行緒加入單執行緒執行的時間,用時最長的就是所有執行緒執行的時間?uj5u.com熱心網友回復:
不用解釋這么多,你只有一句話“同步”,你能使用的也只有WaitHandle,哪怕那些人說task,其實依舊是還是WaitHandle
uj5u.com熱心網友回復:
c#等待所有子執行緒執行完畢方法uj5u.com熱心網友回復:
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Task[] tasks = new Task[]
{
Task.Factory.StartNew(()=>{
Thread.Sleep(1000);
}),
Task.Factory.StartNew(()=>{
for (int i = 0; i < 2; i++)
{
Thread.Sleep(1000);
}
}),
Task.Factory.StartNew(()=>{
for (int i = 0; i < 3; i++)
{
Thread.Sleep(1000);
}
}),
};
Task.WaitAll(tasks);
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed.TotalSeconds);
Console.ReadKey();
uj5u.com熱心網友回復:
我覺得不是執行時間最長的吧,比如3個執行緒A、B、C分別執行1s、2s、3s,A執行緒執行1s后B、C執行緒開始執行,那么總花費時間算不算是4s呢uj5u.com熱心網友回復:
搞一個實體變數,賦值一個初始時間,然后啟動執行緒,在每個執行緒的方法的最后給它設定當前時間。這兩個時間相減,不就是了么uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
那再想一個問題,假設最后一個方法會在24分10秒500毫秒結束,請問我怎么知道他結束了,“薛定諤的貓”么,打開了知道結果不稀奇,麻煩在于他現在是“不知生死”
uj5u.com熱心網友回復:
可以發出一個事件
uj5u.com熱心網友回復:
給你寫個簡單的例子。首先要將沒一個獨立的程式程序封裝為一個獨立地Action物件,這樣就容易將每一個作業真正地去認真研究、傳送。
封裝之后,這里就用兩種方法來分別執行它們。
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var rnd = new Random();
var action1 = new Action(() =>
{
Thread.Sleep(rnd.Next(500, 2000));
Console.WriteLine("Action_1 執行完畢");
});
var action2 = new Action(() =>
{
Thread.Sleep(rnd.Next(500, 2000));
Console.WriteLine("Action_2 執行完畢");
});
var action3 = new Action(() =>
{
Thread.Sleep(rnd.Next(500, 2000));
Console.WriteLine("Action_3 執行完畢");
});
var action4 = new Action(() =>
{
Thread.Sleep(rnd.Next(500, 2000));
Console.WriteLine("Action_4 執行完畢");
});
var array = new Action[] { action1, action2, action3, action4 };
Console.WriteLine("同步執行array:");
foreach (var proc in array)
proc();
Console.WriteLine("并發執行array:");
Wait(array);
Console.WriteLine(".................按任意鍵結束");
Console.ReadKey();
}
static void Wait(Action[] actions)
{
var tasks = actions.Select(async proc =>
{
await Task.Yield();
proc();
});
Task.WaitAll(tasks.ToArray());
}
}
}
uj5u.com熱心網友回復:
另外,實際上如果你并發執行各方法時其實不想阻塞主執行緒,應該使用 async/await 方式將主執行緒程序中的陳述句封裝。例如:using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var rnd = new Random();
var action1 = new Action(() =>
{
Thread.Sleep(rnd.Next(500, 2000));
Console.WriteLine("Action_1 執行完畢");
});
var action2 = new Action(() =>
{
Thread.Sleep(rnd.Next(500, 2000));
Console.WriteLine("Action_2 執行完畢");
});
var action3 = new Action(() =>
{
Thread.Sleep(rnd.Next(500, 2000));
Console.WriteLine("Action_3 執行完畢");
});
var action4 = new Action(() =>
{
Thread.Sleep(rnd.Next(500, 2000));
Console.WriteLine("Action_4 執行完畢");
});
var array = new Action[] { action1, action2, action3, action4 };
Console.WriteLine("同步執行array:");
foreach (var proc in array)
proc();
Console.WriteLine("并發執行array:");
Wait(array);
Console.WriteLine(".................按任意鍵結束");
Console.ReadKey();
}
static async void Wait(Action[] actions)
{
var tasks = actions.Select(async proc =>
{
await Task.Yield();
proc();
});
await Task.WhenAll(tasks.ToArray());
Console.WriteLine("執行array結束");
}
}
}
uj5u.com熱心網友回復:
我給你解釋一下,Action 以及 Func 委托都是同步順序執行的物件。那么上面的代碼把 Action集合再次重新封裝轉換為一個委托任務集合,轉換函式程序(這里使用了 lamda 匿名運算式來簡寫了一下)中通過 Await Yield() 陳述句,告訴 c# 編譯器回傳的委托物件應該封裝為異步任務。這就是 .net 最近6、7年的一個比較“新的”技術,就是能自動編譯為 Task 或者 Task<> 物件,比之前同步的 Action 和 Func<> 更直截了當地支持異步并發編程。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/74845.html
標籤:C#
