我有一些類似于以下的代碼。我想在擁有nextWorkItemNumber. 我怎么能修改這段代碼來完成呢?
在回圈中的下一個任務取決于上一個任務中途獲得的值之前,我從來不需要多執行緒。
public void DoWork()
{
int nextWorkItem = 1;
while(nextWorkItem > 0)
{
nextWorkItem = DoWork(nextWorkItem);
}
}
public int DoWorkItem(int workItemNumber)
{
// make service call for data
// var nextWorkItemNumber = someNewValueBasedOnStuffAbove;
// save results to database
// return nextWorkItemNumber;
}
為簡單起見,將服務呼叫視為需要一秒鐘運行的亂數生成器可能會有所幫助。實際情況更像是我一次從Hubspot檢索 100 條記錄,并且我必須在串列中提供開始的起點,但是串列不會逐個增加,這是我可以的唯一方法給出下一個請求的起點是查看當前請求上最后一條記錄的id。
uj5u.com熱心網友回復:
看看這個。我現在必須運行,所以稍后我會添加一些解釋。
void Main()
{
DoWork();
}
public void DoWork()
{
var saves = new List<Task<(int workItemNumber, bool success)>>();
int nextWorkItem = 1;
while (nextWorkItem > 0)
{
var result = DoWork(nextWorkItem);
saves.Add(DoSaveAsync(result.current, result.payload));
nextWorkItem = result.next;
}
Task.WaitAll(saves.ToArray());
}
private Random _random = new Random();
public (int current, int next, object payload) DoWork(int workItemNumber)
{
var next = workItemNumber _random.Next(5) 1;
if (next > 20)
{
next = -1;
}
return (workItemNumber, next, new object());
}
public async Task<(int workItemNumber, bool success)> DoSaveAsync(int workItemNumber, object payload)
{
await Task.Delay(TimeSpan.FromSeconds(1.0));
return (workItemNumber, true);
}
現在,您會注意到每次保存都需要一秒鐘,但運行的總時間剛剛超過一秒鐘。
uj5u.com熱心網友回復:
這個樣本怎么樣:
var manualResetEvent = new ManualResetEvent(false);
var nextWorkItemNumber = 0; // not ready yet
Task.Run(() =>
{
// this will block inside the Task, until signaled
manualResetEvent.WaitOne();
// nextWorkItemNumber is ready now
// do some processing here
});
Task.Run(() =>
{
// do some work to calculate nextWorkItemNumber
nextWorkItemNumber = 42; // because it's the answer to everything
// signal that nextWorkItemNumber is ready
manualResetEvent.Set();
// keep doing more work if needed
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407131.html
標籤:
