相关疑难解决方法(0)

.Net 4.0中没有ConcurrentList <T>?

我很高兴看到System.Collections.Concurrent.Net 4.0中的新命名空间,非常好!我见过ConcurrentDictionary,ConcurrentQueueConcurrentStack,ConcurrentBagBlockingCollection.

似乎神秘缺失的一件事是ConcurrentList<T>.我是否必须自己写(或从网上下载:))?

我错过了一些明显的东西吗?

.net c# parallel-processing task-parallel-library

193
推荐指数
7
解决办法
11万
查看次数

IEnumerable Linq方法是线程安全的吗?

我想知道Linq扩展方法是否是原子的?或者,在进行任何迭代之前,我是否需要跨线程使用的lock任何IEnumerable对象?

声明变量volatile对此有何影响?

总结一下,以下哪项是最好的,线程安全,操作?

1-没有任何锁:

IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
Run Code Online (Sandbox Code Playgroud)

2-包括锁定语句:

IEnumerable<T> _objs = //...
lock(_objs)
{
    var foo = _objs.FirstOrDefault(t => // some condition
}
Run Code Online (Sandbox Code Playgroud)

3-将变量声明为volatile:

volatile IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
Run Code Online (Sandbox Code Playgroud)

c# multithreading atomic thread-safety

20
推荐指数
2
解决办法
1万
查看次数

写锁定被释放而不被保持

我有一种情况,ReadWriterLockSlim抛出异常"System.Threading.SynchronizationLockException - 写锁定被释放而不被保留." 当我尝试执行ExitWriteLock()时.据我所知,这不应该发生,因为进入try块的后续线程将"阻塞"直到他们可以获得锁定.我在这里错过了什么吗?

该问题与问题非常相似,但没有找到解决方案.

//Code simplified for example. 

public class i18nService {
    internal static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);

    private string ProcessText()
    {
        try {
            cacheLock.EnterWriteLock();
            return "xyz";
        }
        finally {
            cacheLock.ExitWriteLock(); // Error is throwing here. 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助 :-)

.net c#

8
推荐指数
2
解决办法
5074
查看次数

返回只读并发列表

我想知道,假设我有一个 ConcurrentBag 封装在这样的对象中

class Package
{
   private ConcurrentBag<string> myList;
   public string title {get; private set;}
   public string description {get; private set;}

   public Package(string title,string description)
   {
       myList = new ConcurrentBag<string>();
       this.title = title;
       this.description = description;
   }


   public override string ToString()
   {
       return title + " " + description;
   }
}
Run Code Online (Sandbox Code Playgroud)

我将如何返回我的 ConcurrentBag 的只读版本?

.net c#

5
推荐指数
1
解决办法
1047
查看次数

Powershell:为什么使用 ForEach-Object -Parallel 后我的变量为空?

我正在尝试使用 ForEach-Object -Parallel 从多个服务器收集数据。我使用的变量正在循环内填充,但是当循环完成时该变量为空。

$DBDetails = "SELECT @@VERSION"

$VMs = ("vm1", "vm2", "vm3", "vm4", "vm5", "vm6", "vm7")
$DBInventory = @()

$scriptBlock = {
    $vm = $_
    $result = Invoke-Sqlcmd -ServerInstance $vm -Query $using:DBDetails
    $DBInventory += $result
    Write-Host "Added $($result.Count) rows from $($vm)"
}

$VMs | ForEach-Object -Parallel $scriptBlock
Write-Host "Number of elements in DBInventory: $($DBInventory.Count)"
Run Code Online (Sandbox Code Playgroud)

我希望最后一行返回在前一行执行的循环中收集的元素数量。总共应该有 7 个元素,但我一个都没有。

我的结果如下所示:

Added 1 rows from vm1
Added 1 rows from vm2
Added 1 rows from vm3
Added 1 rows from vm4
Added …
Run Code Online (Sandbox Code Playgroud)

powershell foreach-object

5
推荐指数
1
解决办法
808
查看次数