簡體   English   中英

寫入由 C# 中的 foreach 循環創建的 Task 內的文件

[英]Writing to files inside of a Task which is created by a foreach loop in C#

所以我遇到了一個有趣的問題。 我必須編寫一個實用程序應用程序來訪問 web 服務以提取數據並將其寫入文件。 問題是我必須使用不同的參數對該 Web 服務進行多次並發調用,並將結果寫入不同的文件。 這是它在偽代碼中的要點......

    var taskList = new List<Task>();
    foreach (string rCode in _config.rCodes) {
        taskList.Add(Task.Factory.StartNew(() =>
        {
            using (TextWriter tw = new StreamWriter(_config.OutputPath + string.Format(@"\{0}-{1}.csv", rCode, DateTime.Now.ToString("yyyy-MM-ddHHmmssfff")), false)) {
                <call webservice and write to the output file using tw.WriteLine>
            }
        }
    }
    Task.WaitAll(taskList.ToArray());

任務被創建,網絡服務被調用,數據正在被寫入,但是我遇到了各種各樣的沖突。 我看到用於一個文件的數據最終出現在另一個文件中。 我覺得每個創建的任務中 TextWriter 的每個實例都在相互爭斗,但在我看來,它們不應該是因為 TextWriter 的范圍是創建它的任務嗎?

我做了一些研究,有人建議做一個 Parallel.Foreach 但我遇到了同樣的問題。 我想同時運行這些的原因是由於我們第三方的結果集每 15 分鍾需要一次並且串行而不是並行運行可能會推動該限制(影響面向公眾的應用程序)。 現在,我們還好,但在一年中比較繁忙的時候,當數據集變大時,這可能會導致問題。

問題是rCode在外部范圍內,使其成為子任務的全局變量。

要糾正它,您可以執行以下操作:

foreach (string rCode in _config.rCodes)
{
    string code = rCode;
    taskList.Add(Task.Factory.StartNew(() =>
    {
        using (TextWriter tw = new StreamWriter(_config.OutputPath + string.Format(@"\{0}-{1}.csv", code, DateTime.Now.ToString("yyyy-MM-ddHHmmssfff")), false)) {
            // ...
        }
    }
}

暫無
暫無

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

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