队列任务线程

时间:2015-02-12 12:18:08

标签: c# winforms queue

我有一种方法可以在每个路径中加载大量数据。

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 ...

2 个答案:

答案 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

这个队列是线程安全的,你可以推送一个已处理的项目并从另一个(主?)线程中检索它。