簡體   English   中英

Parallel.ForEach的第一個循環

[英]First loop of a Parallel.ForEach

我想在Parallel.ForEach的第一個循環內運行一些代碼。 僅在第一個循環中為准。 原因是將一些診斷數據寫入由循環內的代碼生成的磁盤。 在第一個循環之后,數據將僅保留在內存中,並在以后聚合。 這行得通嗎?

bool firstLoop = true;
Parallel.ForEach(someList, 
    p=>
    {
        // do something here

        if (firstLoop)
        {
            firstLoop = false;

            // do something here for the first loop
        }
    });

正如我在評論中提到的那樣,這完全不能保證有效。 一種選擇是創建一個鎖,並且僅評估和更新firstLoop內的firstLoop 但是,這將導致您失去一些並行性,並建議您尋找一種更好的方法,除非您在完成該操作所需的時間中沒有緊迫的需求。

請記住,這並不保證firstLoop將在列表中的第一項上求值,而僅保證它一次只能為true。

var someList = new List<string>();
var obj = new object();

for (int i = 0; i < 1000; i++)
{
    someList.Add(i.ToString());
}

bool firstLoop = true;
var rand = new Random(Guid.NewGuid().GetHashCode());
Parallel.ForEach(someList,
    p =>
    {
        // do something here
        var next = rand.Next(1, 100);
        Thread.Sleep(next);
        lock (obj)
        {
            if (firstLoop)
            {
                firstLoop = false;
                firstLoop.Dump();
                // do something here for the first loop
            }
        }
    });

如果您需要在第一項上進行某些操作,而其余的迭代不依賴於正在執行的操作,則可以使用以下內容查看是否正在處理第一項

if (p==items.First())
{
    //Do something
}

如果您需要執行其余循環將依賴的操作,則可以使用David建議的鎖,也可以在Parallel.ForEach之前執行所需的操作。

所以你可以做

//Do stuff using someList(0)

Parallel.ForEach(someList.Skip(1), p=>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM