2011-07-12 59 views
0

我有一個應用程序處理來自文本文件的數據 - 它從文件讀取一行然後處理它,然後將結果放入另一個文件。處理完一行後,它會處理下一行,直到完成整個文件。處理文件中的某些行非常耗時。所以我決定把處理邏輯放在單獨的線程中,如果處理需要更長的時間10秒。我殺了線程。所以我的代碼是這樣的:c#任務類和內存泄漏

public class Handler 
{ 
    public void Handle(string row) 
    { 
     // Perform handling 
    } 
} 

public class Program 
{ 
    private static bool HandleRow(string row) 
    { 
     Task task = new Task(() => new Handler().Handle(row)); 
     task.Start(); // updated 
     var waitResult = task.Wait(timeout); // timeout is 10 sec. 
     if(waitResult == false || task.IsFaulted) 
     return false; 
     return true; 
    } 

    public static void Main() 
    { 
     foreach(var row in GetRowsToHandle()) 
     HandleRow(row); 
    } 
} 

但不知何故運行程序時,我得到了內存異常。看來內存沒有正確釋放。
有誰知道爲什麼會發生內存泄漏?我的代碼嗅探器忘了包含task.Start()。現在我把它放在那裏

+0

你在哪裏想你「殺死線程」?我沒有看到這方面的證據... –

+0

什麼行引發內存異常? – Polyfun

回答

1

你的10s超時只會超出任務。它不會停止執行Handle()(如果它確實啓動 - 我不能在那裏看到Start)。這意味着你在本地看到task超時。

此外,它部分取決於什麼GetRowsToHandle()沒有 - 它返回一個非緩衝序列,或者是一個列表等

雖然Task確實支持取消,這需要從合作實施。說實話,既然你沒有做任何異步,你可能會更好,只是在Handle()處理你自己的「我花了太久」的基本超時。不建議使用線程中止(其他選項)。