2014-09-19 97 views
1

在一些用戶的幫助下,他們能夠提供幫助以讀取文本文件,在具有指定計數的新文件夾中的組中創建新文件。例如,我正在閱讀的文本文件有10,000行(在這種情況下)。我將它分組爲每行讀取1000行並創建一個新文件夾。預期的輸出應該是由每個文件夾中的2,000個對象(1個圖像文件,1個元數據文件)創建的10個文件夾。但是,實際輸出是使用每個文件夾中的正或負2,000個對象創建的10個文件夾。實際輸出並不總是將相應的1個圖像文件與其1個元數據文件放在一起。有時他們在同一個文件夾中(它應該是這樣),而有些時候他們在單獨的文件夾中(不應該這樣做)。在新文件夾中創建新文件組不一致

我跨過了程序,不明白爲什麼發生這種情況。以下是我用來執行上述操作的代碼。

private string[] sourceline = new string[] {}; 
private string folder = string.Empty; 
private int bs = 1000; 

... 

Thread t1 = new Thread(
new ThreadStart(() => 
{ 
    sourceline = File.ReadAllLines(@"C:\guids.txt") 

    int batchcount = (sourceline.Length/bs) + 1; 

    for (int i = 0; i < batchcount; i++) 
    { 
     Directory.CreateDirectory(@"C:\zz\" + i.ToString()); 
    } 

    Parallel.For(0, sourceline.Length, x => 
    { 
     folder = ((int)(Array.IndexOf(sourceline, sourceline[x])/bs)).ToString(); 

     //i call a function here to go retrieve my document 
     //findmydoc(objsto, sourceline[x]); <== this is how I call my function 
    } 

    Array.Clear(sourceline, 0, sourceline.Length); 
    sourceline = null; 

})); 
t1.IsBackground = true; 
t1.Start(); 

程序並在整個文本文件中讀取並創建我希望看到(在這種情況下20,000)文件的正確量。如前所述,它與每個文件夾創建2,000個對象不一致,並且並不總是將這兩個文件放在同一個文件夾中。任何有識之士都非常感謝!謝謝大家。

回答

0

您的文件夾變量在所有任務之間共享,並且其值保持不斷變化。 儘量使內部的Parallel.For一個私有變量

Parallel.For(0, sourceline.Length, x => 
{ 
    string folder = ((int)(Array.IndexOf(sourceline, sourceline[x])/bs)).ToString(); 

    //i call a function here to go retrieve my document 
} 
+0

我使用了「文件夾」中,我稱之爲(評論區)的函數變量給我的功能正在創建的位置文件文件夾(如果這是有道理的)。 – Jayarikahs 2014-09-19 21:01:14

+0

當我在Parallel.For中創建變量「string folder」時,我得到一個「名稱文件夾在當前上下文中不存在」,因爲我使用自定義函數內的「文件夾」變量來引用該位置。這就是爲什麼我在頂部聲明「私人字符串文件夾」的原因。 – Jayarikahs 2014-09-19 21:18:19

+0

您可以將自定義函數更改爲接受該文件夾作爲參數,而不是使用共享變量。 – 2014-09-19 21:21:25