tôi đã tự hỏi: Khóa chỉ cho phép 1 thread để nhập một mã vùngAutoResetEvent là một thay thế Khóa trong C#?
Và chờ xử lý là cho hệ thống báo::
hiệu là khi một chờ đợi chủ đề cho đến khi nó nhận được thông báo từ khác.
Vì vậy, tôi tự nghĩ, điều này có thể được sử dụng để thay thế khóa không?
cái gì đó như:
Thread number 1 --please enter (autoreset --> autlock)
dowork...
finish work...
set signal to invite the next thread
Vì vậy, tôi đã viết này:
/*1*/ static EventWaitHandle _waitHandle = new AutoResetEvent(true);
/*2*/
/*3*/ volatile int i = 0;
/*4*/ void Main()
/*5*/ {
/*6*/
/*7*/ for (int k = 0; k < 10; k++)
/*8*/ {
/*9*/ var g = i;
/*10*/ Interlocked.Increment(ref i);
/*11*/ new Thread(() = > DoWork(g)).Start();
/*12*/
/*13*/ }
/*14*/
/*15*/ Console.ReadLine();
/*16*/ }
/*17*/
/*18*/
/*19*/ void DoWork(object o)
/*20*/ {
/*21*/ _waitHandle.WaitOne();
/*22*/ Thread.Sleep(10);
/*23*/ Console.WriteLine((int) o + "Working...");
/*24*/ _waitHandle.Set();
/*25*/
/*26*/ }
như bạn có thể thấy: dòng # 21, # 24 là sự thay thế cho các khóa.
Câu hỏi:
- Có một sự thay thế hợp lệ? (không phải tôi sẽ thay thế
lock
, nhưng muốn biết về các kịch bản sử dụng) - Tôi nên sử dụng mỗi khi nào?
Cảm ơn bạn.
lạ nhưng SO không chứa một câu hỏi liên quan _lock vs EventWaitHandle_
SO có câu hỏi tương tự: http://stackoverflow.com/questions/1717194/autoresetevent-manualresetevent-vs-monitor – empi
@empi heh, tất cả 3 cụm từ đều có trong thành phần chung (monitor.enter vs lock, autoreset vs waithandle ....) nhưng yeah nó tương tự.tuy nhiên xin lưu ý rằng 'AutoResetEvent/waithdnales' là ** không được chia sẻ ** giữa các quá trình. người viết nhầm lẫn với Mutex. dù sao anh ta cũng sai. (về điều đó). –
@empi cũng là câu trả lời được đánh giá cao nhất về sự khác biệt khi có lệnh được thiết lập (thời tiết nếu chuỗi đang chờ hay không). –