2011-02-16 38 views
6

Thực hành không tốt để sử dụng vòng lặp trong khi đó? Có lẽ tốt hơn là sử dụng Đồng hồ bấm giờ, hoặc có thể giải pháp này có một số cạm bẫy?Triển khai C# timeout

public void DoWork() 
    { 
     //do some preparation 
     DateTime startTime = DateTime.Now; 
     int rowsCount = 0; 
     int finalCount = getFinalCount(); 
     do 
     { 
      Thread.Sleep(1000); 
      rowsCount = getRowsCount(); // gets rows count from database, rows are added by external app. 
     } while (rowsCount < finalCount && DateTime.Now - startTime < TimeSpan.FromMinutes(10)); 

    } 

tôi thấy bài viết này Implement C# Generic Timeout, nhưng nó là quá phức tạp để sử dụng trong các tình huống đơn giản - bạn cần phải suy nghĩ về đồng bộ hóa của chủ đề, nó là thích hợp để hủy bỏ chúng hay không và như vậy.

+3

Bạn muốn làm gì với Tạo thời gian chính xác? Nếu bạn nói với toàn bộ scenerio của bạn, có lẽ chúng tôi có thể cung cấp cách khác nhau để sử dụng. –

+0

Related/duplicate: http://stackoverflow.com/questions/3195030/thread-timeout-in-c – RQDQ

+0

Chỉ cần dừng công việc sau một thời gian - bắt đầu công việc, nếu nó chạy hơn 10 phút thì dừng công việc. Chủ đề gọi phương thức có thể bị chặn. – anderhil

Trả lời

15

Khi tôi hiểu điều đó, bạn muốn phương pháp của bạn thực hiện một số công việc cho đến khi hoàn thành hoặc cho đến khi một khoảng thời gian trôi qua? Tôi sẽ sử dụng một số Stopwatch cho điều đó và kiểm tra thời gian đã trôi qua trong một vòng lặp:

void DoWork() 
{ 
    // we'll stop after 10 minutes 
    TimeSpan maxDuration = TimeSpan.FromMinutes(10); 
    Stopwatch sw = Stopwatch.StartNew(); 
    DoneWithWork = false; 

    while (sw.Elapsed < maxDuration && !DoneWithWork) 
    { 
     // do some work 
     // if all the work is completed, set DoneWithWork to True 
    } 

    // Either we finished the work or we ran out of time. 
} 
+0

Cảm ơn câu trả lời. Tôi nghĩ về đồng hồ bấm giờ lúc đầu, sau đó tôi quyết định rằng DateTime là đơn giản hơn, bạn có thể giải thích lý do tại sao đồng hồ bấm giờ là tốt hơn? Tôi nghĩ rằng nó thực hiện dựa trên DateTime ... – anderhil

+1

@anderhil: Tôi nghĩ rằng Đồng hồ bấm giờ là dễ đọc hơn nhiều :). Ưu điểm duy nhất khác trên DateTime.Now là đồng hồ bấm giờ * có thể * có độ phân giải cao hơn (tuy nhiên, điều đó không quan trọng đối với bạn). –

+8

Tôi sẽ không sử dụng 'DateTime' vì ngày có thể thay đổi bên dưới tôi đến Daylight Saving Time. Điều này có thể khiến mã chờ quá lâu (một giờ và 10 phút) hoặc có thể khiến mã không chờ đủ lâu. Nhưng 'Đồng hồ bấm giờ 'biết bao nhiêu phút trôi qua, bất kể thời gian là bao nhiêu. –

2

Tốt hơn nên sử dụng lớp System.Timers.Timer.

+2

Đó không phải là tính năng của Timer. –

+0

Có, nhưng những gì tôi đã tìm kiếm ...: D "Timeout" có thể gây hiểu nhầm, bởi vì phương thức 'setTimeout()' của Javascript thực sự làm những gì 'System.Timers.Timer' thực hiện trong C#. –