2012-02-02 61 views
6

Tôi có một mã khi chạy, nó thực hiện chuỗi các dòng theo thứ tự. Tôi muốn thêm tạm dừng ở giữa.Thay thế cho Thread.Sleep in C#?

Hiện nay, tôi có nó như thế này

//do work 
Thread.Sleep(10800000); 
//do work 

Tuy nhiên điều này đóng băng các phần mềm, và tôi nghĩ rằng đó là bởi vì thời gian ngủ là cách quá dài. Tôi đã tìm kiếm trực tuyến và tôi tìm thấy một tác phẩm khác được gọi là Bộ hẹn giờ. Ai đó có thể hiển thị cho tôi mã mẫu cho Bộ hẹn giờ hoạt động giống như Thread.sleep không?

Cảm ơn bạn trước.

Chỉnh sửa: Tôi cần phần mềm để đợi 3 giờ trước khi tiếp tục với phần còn lại của việc thực thi mã. Phần mềm này có nghĩa là để giao tiếp với máy móc, và tôi không thể để phần còn lại của mã thực hiện trong khi chờ đợi 3 giờ.

+2

Vì vậy, ... sử dụng một thời gian ngủ ngắn hơn? 10 800 000 mili giây là ba giờ. Bộ hẹn giờ và ngủ phục vụ cho các mục đích khác nhau, bạn không thể thay thế một cái với nhau. – millimoose

+2

Er, tại sao bạn yêu cầu thời gian ngủ là 10800 giây? – Qwertie

+2

Chỉ cần làm rõ, bạn có thực sự muốn ngủ cho '10800000' mili giây (3 giờ) không? – keyboardP

Trả lời

4

Phần mềm của bạn sẽ bị đóng băng nếu giấc ngủ đó nằm trên chuỗi chính. Hãy ghi nhớ tham số bằng mili giây. 10 800 000 mili giây = 10 800 giây

Một cách khác để vượt qua thời gian là chuyển đối tượng TimeSpan thay thế. Ví dụ:

// Sleep for 10 seconds 
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 10)); 

Đối với timer:

Bạn có thể sử dụng System.Timers.Timer;

Timer timer = new Timer(); 
timer.Interval = 20; // milliseconds 
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
timer.AutoReset = true; // if not set you will need to call start after every event fired in the elapsed callback 
timer.Start(); 
6

Vui lòng xem this MSDN reference on the System.Threading.Timer class. Có một lời giải thích tuyệt vời, tất cả các thành viên trong lớp và một số mã mẫu để bạn theo dõi khi kiểm tra/học tập.

Hãy nhớ rằng, bạn nên sử dụng Timer khi bạn muốn kích hoạt sự kiện tại một khoảng thời gian nhất định. Nếu bạn chỉ muốn tạm dừng thực hiện ứng dụng của mình, thì bạn nên đi với Thread.Sleep(). Tuy nhiên, như nhiều người khác đã chỉ ra, bạn đang làm cho thread của bạn ngủ trong một khoảng thời gian dài.

2

Thread.Sleep là những gì bạn muốn sử dụng cho điều này, bạn có thể muốn sử dụng thời gian ngủ hợp lý hơn 3 giờ.

Cập nhật:

Sau khi đọc một số ý kiến, Thread.Sleep có lẽ không phải những gì bạn muốn. Sử dụng một số System.Threading.Timer thay vì những người khác đã đề xuất.

+0

Nếu yêu cầu ** là ** chờ 3 giờ trước khi chạy một số mã, sau đó sử dụng 'Thread.Sleep' không phải là những gì anh ta nên sử dụng. – ken2k

+0

Đồng ý, tôi đã cập nhật. –

+0

Nó có thể là một vấn đề luôn luôn xảy ra. Nó cũng không nói nó trên một biểu mẫu, có thể là một dịch vụ hoặc dấu nhắc lệnh. Trong khi nó không âm thanh như ông đã làm nó một cách chính xác, có rất nhiều lý do để có những điều xảy ra một lần bao giờ x giờ (db sao lưu, làm sạch chức năng, vv). – JeremyK

0

Bạn đang ngủ chủ đề trong 10800 giây hoặc 3 giờ. Thread.Sleep() được thiết kế để đóng băng luồng của bạn, dừng bất cứ thứ gì làm việc trong phần mềm trong thời gian đó. Trong trường hợp này, thời lượng là 18 phút. Bạn đang cố làm gì vậy?

2

Vấn đề của bạn là bạn đang chặn luồng chính của ứng dụng, chịu trách nhiệm giữ ui hoạt động. Bạn không nên làm điều này. Thay vào đó, hãy sử dụng bộ hẹn giờ - Biểu mẫu có thể dễ dàng nhất trong ứng dụng Biểu mẫu hoặc xem xét BackgroundWorker.(Để chờ lâu như vậy, bộ hẹn giờ có thể phù hợp hơn)

1

Thread.Sleep thường được sử dụng để tạm dừng một chuỗi riêng biệt, không phải trong chuỗi chính của ứng dụng.

Bộ định thời thường sẽ được sử dụng định kỳ làm cho luồng chính ngừng hoạt động bình thường và xử lý sự kiện.

Có thể sử dụng một trong hai phương pháp để định kỳ thực hiện chức năng sau một khoảng thời gian nhất định.

Điều tôi không làm là yêu cầu chủ đề chính ngủ trong 3 giờ.

4

SỬ DỤNG GIỜ!

private DispatcherTimer Timer; 
public Constructor 
{ 
    Timer = new System.Windows.Threading.DispatcherTimer(); 
    Timer.Tick += new EventHandler(Timer_Tick); 
    Timer.Interval = new TimeSpan(0,0,10); 
    Timer.Start(); 
} 


private void Timer_Tick(object sender, EventArgs e) 
{ 
    Timer.Stop(); 
    Timer -= Timer_Tick; 
    Timer = null; 
    // DO SOMETHING 
} 
1

Tôi nghĩ bạn nên sử dụng Monitor. Nó giúp bạn chờ đợi các đối tượng và nhả khóa khi bạn cần tiếp tục chạy chương trình.

Bạn nên tìm câu trả lời của bạn ở đây: Safe Thread Synchronization

1

Bạn có thể thay

Thread.Sleep(X); 

bởi

Task.WaitAll(Task.Delay(X));