在带锁的对象内使用Task.Factory.StartNew

时间:2019-01-14 13:21:30

标签: c# multithreading

在用锁锁定的对象内使用多线程是否存在隐患?

说明:

我正在编写Outlook加载项,其中的邮件可以从3种其他语言翻译,因为邮件线程将具有多语言内容。 (语言)词典放置在公共的Container对象中。这些词典非常大,并且依赖于从特定于语言的文件中读取单词进行翻译。

打开几封邮件时,它们将调用相同的Container对象进行翻译。为了防止两个或多个邮件同时修改Container-object和语言字典,我在方法调用中使用了锁定。因为每封邮件都可以包含多种语言的内容,所以我想使文件并行访问不同的语言文件,以提高性能和用户体验。

Dictionary<LanguageType, LanguageDictionary> Dictionaries;
Dictionary<Language, List<Words>> NewWords;
public void UpdatelanguageDictionaries()
{
    lock(_lock)
    {
       DoStuff();

       int i = 0;
       Task[] tasks = new Task[3];
       foreach(KeyvaluePair<LanguageType, LanguageDictionary> kvp in Dictionaries)
       {
          tasks[i] = TaskFactory.StartNew(() => kvp.Value.UpdateFromFile(NewWords[kvp.Key]));
          i++;
       }
       Task.WaitAll();

       DoMoreStuff();
     }
}

首先,我尝试在 await async 中使用多线程,但这在lock语句中并不是很大(锁定中的多线程指示问题)。

代码按预期工作,但有时会出现与多线程部分无关的错误,但是当我运行UpdateFromFile()时不会发生。按顺序。众所周知,由于多线程导致的错误也很难识别,因此,如果在锁内使用多线程并不是一个好主意,我不会花很多时间来识别错误。

那么保存在锁语句中运行多线程代码还是应该避免?

0 个答案:

没有答案