sách gpt4 ăn đã đi

c# - 使用 await 时 Monitor.Exit 上的 SynchronizationLockException

In lại 作者:太空狗 更新时间:2023-10-29 19:48:40 28 4
mua khóa gpt4 giày nike

我正在创建一段代码,从我们拥有的遗留系统中获取网页。为了避免过度查询,我缓存了获取到的URL。我正在使用 Monitor.EnterMonitor.Exit 并仔细检查以避免发出两次请求,但是当使用 Monitor.Exit 释放锁时>,我遇到了这个异常:

System.Threading.SynchronizationLockException was caught
HResult=-2146233064
Message=Object synchronization method was called from an unsynchronized block of code.
Source=MyApp
StackTrace:
at MyApp.Data.ExProvider.d__0.MoveNext() in c:\Users\me\Documents\Visual Studio 2013\Projects\MyApp\MyApp\Data\ExProvider.cs:line 56
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndwindowNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at MyApp.Data.ExProvider.d__15.MoveNext() in c:\Users\me\Documents\Visual Studio 2013\Projects\MyApp\MyApp\Data\ExProvider.cs:line 71
InnerException:

第 56 行是 Monitor.Exit。这是执行操作的代码:

private async Task OpenReport(String report)
{
var file = _directory.GetFiles(report+ ".html");
if (file != null && file.Any())
return file[0].OpenRead();
khác
{
thử
{
Monitor.Enter(_locker);
FileInfo newFile = new FileInfo(Path.Combine(_directory.FullName, report + ".html"));
if (!newFile.Exists) // Double check
{
using (var target = newFile.OpenWrite())
{
WebRequest request = WebRequest.Create(BuildUrl(report));
var response = await request.GetResponseAsync();
using (var source = response.GetResponseStream())
source.CopyTo(target);
}
}
return newFile.OpenRead();
}
Cuối cùng
{
Monitor.Exit(_locker);
}
}
}

那么chờ đợiMonitor有什么问题呢?是不是因为 Monitor.EnterMonitor.Exit 不是同一个线程?

câu trả lời hay nhất

您不能在 khóa 范围内chờ đợi 任务(这是 Monitor.EnterMonitor.Enter 的语法糖。退出)。直接使用 Monitor 会欺骗编译器而不是框架。

async-await 没有像 Monitor 那样的线程亲和性。 chờ đợi 之后的代码可能会在与其之前的代码不同的线程中运行。这意味着释放 Monitor 的线程不一定是获取它的线程。

在这种情况下,要么不要使用 async-await,要么使用不同的同步构造,例如 SemaphoreSlim 或您可以构建的 AsyncLock你自己。这是我的:https://stackoverflow.com/a/21011273/885318

关于c# - 使用 await 时 Monitor.Exit 上的 SynchronizationLockException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21404144/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress