【发布时间】:2013-08-01 08:49:20
【问题描述】:
我有一个文件列表,我需要运行的每个文件(PCAP 文件 - 传输数据包)都有自己的运行时间。
因为我想要处理超过 1 个并行文件的选项,所以我使用这个函数来获取 IEnumerable<string> source 和最大并行线程数:
public void doWork(IEnumerable<string> _source, int parallelThreads)
{
_tokenSource = new CancellationTokenSource();
var token = _tokenSource.Token;
Task.Factory.StartNew(() =>
{
try
{
Parallel.ForEach(_source,
new ParallelOptions
{
MaxDegreeOfParallelism = parallelThreads //limit number of parallel threads
},
file =>
{
if (token.IsCancellationRequested)
return;
//process my file...
});
}
catch (Exception)
{ }
}, _tokenSource.Token).ContinueWith(
t =>
{
//finish all the list...
}
, TaskScheduler.FromCurrentSynchronizationContext() //to ContinueWith (update UI) from UI thread
);
}
例如,如果我有 10 个文件的列表并且我的最大并行线程数是 4,那么我的程序开始并行传输 4 个文件,并且在第一个文件完成后,另一个文件自动启动,如果我传输所有文件,这很好用我的清单 1 次。
在添加了循环播放所有列表的选项后,我遇到了一个问题,例如,如果我想播放所有列表两次,则在第一个循环结束后第二个开始,在第一个文件完成后在此循环中完成所有UI 卡住了,没有响应。 我和朋友谈过他是 C# 开发人员,他告诉我这可能是任务已知问题,有时会陷入僵局。 是否可以使用另一个类而不是任务?
【问题讨论】:
-
1.对异常做一些事情,它可能会给你一个很好的提示,出了什么问题。 2、UI卡住的时候,是主线程的问题。因此,请添加您遗漏的代码,因为我猜问题会出现在某个地方。
-
从来没有听说过这个“任务已知问题,有时会陷入僵局”,但我看到人们使用(等待)来自不同任务的共享资源导致死锁。
-
我可以有一个没有任务的代码示例吗?
标签: c# multithreading winforms task-parallel-library