比如操作
for (int a = 0; a < 2001; a++)
{
for (int b = 0; b < 2001; b++)
{
for (int c = 0; c < 2001; c++)
{
if (a * a + b * b == c * c && a + b + c == 2000)
{
meNum.Text += $"a是{a},b是{b},c是{c}.\r\n";
}
}
}
}
界面假死, 如果用backgroundWorker或者Thread如何確定進度.
uj5u.com熱心網友回復:
那些資料已經可以作廢了,就像java的不會在去討論SSH,j2ee一樣,該作廢的作廢。
至于你這個用 task 和 IProgress<T> 當然你這個問題本身稍微有些問題,因為進度條首先需要知道total,才能用有進度,但是你這個我們是無法預先確定總數量的,只能告訴你我們已經處理了多少,以及最后他做完沒有。而不能告訴你還剩多少。當然如果你先強行2001*2001*2001告訴我們一共有多少,我們可以顯示進度
var progress = new Progress<int>();
progress.ProgressChanged += (send, e) =>
{
Console.Write($"當前處理到{e}");
};
Task.WhenAll(Program.compute(progress)).ContinueWith(p =>
{
Console.Write("我計算完了");
}) ;
static IEnumerable<Task> compute(IProgress<int> progress)
{
int count = 0;
for (int a = 0; a < 2001; a++)
{
for (int b = 0; b < 2001; b++)
{
for (int c = 0; c < 2001; c++)
{
yield return Task.Run(() =>
{
if (a * a + b * b == c * c && a + b + c == 2000)
{
Console.WriteLine( $"a是{a},b是{b},c是{c}");;
}
Interlocked.Increment(ref count);
progress.Report(count);
});
}
}
}
}
ps:新的net框架有IAsyncIEnumerable 異步迭代器,可以更簡單完成。當然還是那個問題因為不知道總數,我們顯示不了進度,只能反映當前已經處理了多少,不了反應還剩多少,畢竟還剩多少是動態加的
uj5u.com熱心網友回復:
所以你會發現,微軟安裝包和rar壓縮包,顯示進度都是上下兩層微軟安裝包
第一層告訴你我在下載什么檔案,下載進度多少
第2蹭是告訴你我在安裝什么供暖,安裝進度多少
壓縮包
第一層,一共多少檔案
第2層,我正在單個解壓撒,解壓進度多少
他們這樣設計的原因都是如此,無法確定總量。只能反應當前正在干嘛
uj5u.com熱心網友回復:
同樣rar的進度條跟能明顯反應這種問題他不僅上下兩層,他還在進度上設計成深淺2種顏色
來表明動態的總數和完成數
uj5u.com熱心網友回復:
無法確定時間的操作 對應的都是位置。那么為何還要采用進度條。 直接設計成load等待不更加合理一些?
相反,如果你能由判斷依據,比如size,或者時間闕值 那么采用進度條為好。
uj5u.com熱心網友回復:
設定個全域變數,回圈中實時更改變數值(比如進度百分比),然后異步執行緒中把這個值設定為進度條的當前值。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/191362.html
標籤:C#
