我有一种方法可以在每个路径中加载大量数据。
static void Execute()
{
foreach (var path in paths)
{
loadData(path);
}
}
private static Task _loadTask;
private static Dictionary<string, BarClass> _myDictionary = new Dictionary<string, BarClass>();
static void loadData()
{
var myCollections = GetCollections.Collections;
_loadTask = Task.Factory.StartNew((o) =>
{
foreach (var item in myCollections)
{
// Data Manipulation Goes Here
ProcessConcat(_myDictionary, item.Value);
}
}, CancellationToken.None, TaskCreationOptions.LongRunning);
}
static void ProcessConcat(Dictionary<string, BarClass> _myDictionary, string key, BarClass value)
{
if (!_myDictionary.ContainsKey(key))
_myDictionary.Add(key, value)
}
问题是因为我正在使用集合,我总是得到一个例外。 现在我的问题是:我如何实现队列和队列? :
我需要完成加载第一个data1,然后在加载data1之后它将加载下一个Data ...
答案 0 :(得分:0)
您还可以使用ConcurrentDisctionary来避免多线程中的问题
示例:
class Program
{
static ConcurrentDictionary<string, int> _concurrent =
new ConcurrentDictionary<string, int>();
static void Main()
{
Thread thread1 = new Thread(new ThreadStart(A));
Thread thread2 = new Thread(new ThreadStart(A));
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
Console.WriteLine("Average: {0}", _concurrent.Values.Average());
}
static void A()
{
for (int i = 0; i < 1000; i++)
{
_concurrent.TryAdd(i.ToString(), i);
}
}
}
在以下位置找到示例来源和文档:http://www.dotnetperls.com/concurrentdictionary
我不知道但是在你的代码中避免错误你需要使用lock来使收集线程安全,如下所示
private readonly Object lockobj = new Object();
static void ProcessConcat(Dictionary<string, BarClass> _myDictionary, string key, BarClass value)
{
lock(lockobj)
{
if (!_myDictionary.ContainsKey(key))
_myDictionary.Add(key, value)
}
}
答案 1 :(得分:0)
不使用字典,而是使用并发队列:https://msdn.microsoft.com/en-us/library/dd267265(v=vs.110).aspx
这个队列是线程安全的,你可以推送一个已处理的项目并从另一个(主?)线程中检索它。