- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建一段代码,从我们拥有的遗留系统中获取网页。为了避免过度查询,我缓存了获取到的URL。我正在使用 Monitor.Enter
、Monitor.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ờ đợi
VàMonitor
有什么问题呢?是不是因为 Monitor.Enter
Và Monitor.Exit
不是同一个线程?
câu trả lời hay nhất
您不能在 khóa
范围内chờ đợi
任务(这是 Monitor.Enter
Và Monitor.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/
Tôi tin rằng tất cả chúng (thậm chí die() hoặc die(0)) đều giống nhau. Nếu chúng không giống nhau, cái nào tốt hơn cho một kịch bản thoát thành công? Nếu chúng giống nhau, có tiêu chí ưu tiên nào cho biết tập lệnh đã hoàn tất thành công không? Tôi có xu hướng sử dụng lối ra;.
Tôi muốn biết sự khác biệt giữa các mã sau trong Java System.exit(0);System.exit(-1);System.exit(1); Khi nào tôi phải sử dụng mã trên một cách thích hợp?
Tôi nhận thấy hành vi lạ trong Powershell. Có hai tệp .ps1: main.ps1: echo "running exit.ps1" $myexitcode = & ".\exit.p
Có một số khối như "Nguồn" trong Thư viện mô hình hóa quy trình Anylogic có các hoạt động như "Khi thoát" và "Bật khi thoát". Sự khác biệt giữa hai là gì? Tôi cố gắng tạo ra
Vì vậy, tôi có tập lệnh Bash này: #!/bin/bash PID=`ps -u ...` if [ "$PID" = "" ]; then echo $(date) Server off: no
(gdb) biểu tượng thông tin thoát thoát trong phần .text của /lib64/libc.so.6 (gdb) biểu tượng thông tin _exit _exit trong se
Nếu tôi muốn khởi chạy một ứng dụng đơn giản mà tôi đã sử dụng vài tuần trước mà không gặp lỗi, tôi sẽ nhận được thông báo lỗi. Đó là mô tả lỗi của anh ấy: Khởi chạy lib\main.dart trên SM J530F ở chế độ gỡ lỗi..
Câu hỏi này đã có câu trả lời: Sử dụng Platform.exit() và System.exit(int) cùng nhau (3 câu trả lời) Đã đóng 5 năm trước. Ai đó ở đây đã đề xuất sử dụng cái sau. Tôi mới làm quen với java
Tôi hiểu rằng trong bash, một lối thoát bình thường sẽ hoàn thành một tập lệnh với trạng thái thoát của lệnh cuối cùng. Nhưng tôi cũng đã thấy mọi người sử dụng exit $? và bị nghi ngờ khi tôi đề xuất nó có hành vi tương tự. Ý nghĩa giữa hai chữ viết này là gì
Tôi đã thấy một số mã thực hiện điều này: if(something){ echo 'exit from program'; } ...more code và những mã khác chỉ sử dụng die: if
Sự khác biệt giữa thoát và thoát trong Ruby là gì? Câu trả lời hay nhất Một số điều: Trình xử lý thoát chạy dưới dạng "thoát" thay vì "thoát!" Điều này có nghĩa là bất kỳ mã nào được gán cho "Sạch" sẽ không chạy với "Thoát!"
Chúng tôi có một loạt các tập lệnh xây dựng .bat được gọi bởi trình chạy GitLab dựa trên PowerShell gần đây đã được tái cấu trúc từ: chương trình lập luận nếu !errorlevel 0 exit!
Tôi muốn đóng ứng dụng javafx bằng mã trả về được chỉ định. Duyệt qua các câu trả lời trên SO, tôi tìm thấy thành ngữ sau: Platform.exit(); Ví dụ ở đây: Stop thread be;
Sự khác biệt giữa lối ra và std::exit trong C++ là gì? Tôi đã nghiên cứu nó nhưng tôi không thể tìm thấy bất cứ điều gì. Sự khác biệt giữa hai mã này là gì: 1: if(SDL_Init(SDL_INIT_EVERYTHING)
Tôi cần một cách khác để chấm dứt tập lệnh python trong hàm luồng. Ý định của tôi là chấm dứt máy chủ khi máy khách nhập 0... Điều này không có tác dụng vì luồng chưa bị chấm dứt phải không? Đây là mã của tôi: socket = socket.socket(
Tôi muốn khởi động lại ứng dụng sau sự cố. Tôi đang sử dụng mã bên dưới để thực hiện tác vụ. Ý định mStartActivity = ý định mới(HomeActivity.this, SplashScreen
Trong Delphi, bạn có thể thoát khỏi một hàm và cung cấp cho nó một giá trị trả về, rất giống với từ khóa return trong C/C++/Java/C#, v.v. Tuy nhiên, tôi thường viết một cái gì đó như thế này: Result : = 1;
Tôi tự hỏi liệu có cách nào để xử lý các sự kiện thoát trình duyệt hay không. Ví dụ: tôi muốn gửi truy vấn khi người dùng nhấp vào dấu chéo để thoát hoặc đóng trình duyệt. Câu trả lời hay nhất Tôi nghĩ tôi đã tìm ra giải pháp. Tôi chưa thử nó trên IE nhưng có vẻ như nó hoạt động trên Firefox
Tôi tìm thấy đoạn mã sau trong tập lệnh mkinitcpio của Archlinux. cleanup() { if [[ $workdir ]] thì # khi PRESE
Tôi sử dụng đoạn mã sau để tính toán độ tương tự cosine giữa tất cả các hàng của khung dữ liệu: from pyspark.ml.feature import Normalizer from pyspark.mllib.linalg.distrib
Tôi là một lập trình viên xuất sắc, rất giỏi!