我有一个处理来自文本文件的数据的应用程序 - 它从文件中读取一行然后处理它,然后将结果放入另一个文件中。处理完一行后,它处理下一行,直到整个文件完成。文件中的某些行非常耗时。所以我决定将处理逻辑放在单独的线程中,如果处理时间超过10秒。我杀了线程。所以我的代码是这样的:
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 :(得分:1)
你的10s超时仅超过任务。它不会阻止Handle()
执行(如果它确实启动了 - 我看不到Start
。它只是意味着您本地在task
上看到超时。
此外,它部分取决于GetRowsToHandle()
的作用 - 它是返回非缓冲序列,还是列表等等。
虽然Task
支持取消,但这需要实施方面的合作。说实话,既然你没有做任何异步,你可能会更好地处理你自己的“我花了太长时间”基本超时Handle()
。不建议使用线程中止(另一个选项)。
答案 1 :(得分:1)
任务是Disposable:task.Dispose();