我很高兴看到System.Collections.Concurrent.Net 4.0中的新命名空间,非常好!我见过ConcurrentDictionary,ConcurrentQueue和ConcurrentStack,ConcurrentBag和BlockingCollection.
似乎神秘缺失的一件事是ConcurrentList<T>.我是否必须自己写(或从网上下载:))?
我错过了一些明显的东西吗?
我想知道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) 我有一种情况,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)
非常感谢您的帮助 :-)
我想知道,假设我有一个 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 的只读版本?
我正在尝试使用 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)