问题标签 [synclock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2814 浏览

vb.net - 为什么 SyncLock 在这里不起作用?

我正在开发一个类库,它将为 CLR 应用程序提供异步通信。

SslStream 上存在异步读取 (BeginRead),具有多个流共享的单个回调例程。我不希望在调试期间并行处理回调,所以我创建了一个关键部分:

令我惊讶的是,这不起作用,至少当我在 SyncLock 块中设置断点时不起作用。多个流的回调同时在其中运行,无需在入口点等待前一个线程离开它。

单步执行是一场噩梦,尤其是当流同时被关闭(关闭)时:为流 1 执行行,为流 2 执行行,为 1 执行下一行,为 2 执行下一行,依此类推,贯穿整个堵塞。

我想也许你需要的不仅仅是一个通用的“新对象”,但后来我看到这里至少有一个关于堆栈溢出的答案,它说明了 SyncLock 正是我使用它的方式,只有“静态 X 作为新对象”在必须锁定的函数中创建同步对象。

是不是因为回调实际上来自 .Net 框架之外的 win32 线程,所以 SyncLock 在这里不起作用?

0 投票
0 回答
172 浏览

vb.net - Synclock 是锁定对象引用还是对象本身?

标题确实说明了一切,但我提供了一些代码来演示我的要求。

这两个'Some code heres 是否会同时运行(假设它们在单独的线程上)?

0 投票
1 回答
61 浏览

vb.net - 即使您不在单独的线程中,调用 SyncLock 和 MemoryBarrier 是否安全?

这篇文章的后续。我的目标是一次只有一个Calculate,所以我添加了一个 SyncLock:

注意isBack. 如果这是错误的,代码应该只在 main 中运行。这通常在重新计算单个Line. 所以我的问题是关于这两条线的安全性:

文档中我不清楚如果我在 main 中运行的代码中调用这些会发生什么。我已经添加了代码,它似乎运行正常,但我想确保我不会向另一个问题敞开心扉,比如 Abort。这些对于线程和非线程使用都可以吗?

0 投票
1 回答
100 浏览

vb.net - SyncLock 在单元测试中不起作用

我有一个Module我想用来缓存一些东西的东西。这很简单。我想回避,ConcurrentDictionary因为它需要有保证的操作。

事情就是这样。我有一些单元测试来测试利用该HasColumn功能的代码。我像这样设置这些测试:

然后他们测试这个功能:

你可以在这里看到我点击该HasColumn方法的地方。事情就是这样。如果我单独执行这些测试,它们会成功;但是,如果我执行整个测试集,它们就会失败。

显然这里存在线程安全问题,但我无法终生弄清楚我做错了什么。有人可以帮我看看我哪里出错了吗?

测试失败时的输出是:

测试成功时的输出是:

0 投票
1 回答
116 浏览

.net - 如果在 VB.Net 中的块内调用函数,SyncLock 将失去锁定

我已经在 VB.2010 和 2019 中尝试过。这是一个 Windows 桌面应用程序。

它有一个 FileSystemWatcher 创建例程,该例程可以控制何时将文件放入文件夹,然后通过调用的函数处理该文件。调用的函数必须是同步的,如果调用多个实例会出现不可预知的问题。

问题是一旦调用函数(DoMonitorFolder),锁就会丢失,同步锁块将在第一个块完成之前再次进入。

简化代码如下。有了断点,我已经看到:

  1. 如果文件夹中有多个文件,则在第二次到达 End Synclock 之前进入该块。断点放在 SyncLock 之后和 End SyncLock 上
  2. 第二次进入时,RunningFileNowBol 为真。它在输入时在 DoFolderMonitor 中设置为 true,在返回之前设置为 false。
  3. 如果取出 DoFolderMonitor,则仅在 End Synclock 执行后才进入 Synclock 块,这是我所期望的。

那么在块中嵌入函数调用是否有限制?是否有替代方法可以同步从 FSW.Created 调用 DoFolderMonitor?

0 投票
0 回答
33 浏览

vb.net - 如何正确使用同步锁一次只允许调用一个函数

我有向一批计算机发送 ping 的代码,并向任何响应他们在线的人打开 VNC 会话。

ping 在 parallel.foreach 循环中发送,并在收到回复时引发事件。

尽管在 AddHost 代码周围放置了一个同步锁块,但它仍然被多个线程同时输入。

我认为这与另一个对象上的 raiseevent 调用的代码有关。

这是处理事件的方法

从对象 OnlineFinder.vb

我应该怎么做,所以一次只处理一个事件(但它不会挂起 UI)