2014-02-25 28 views
1

我有這樣的特定代碼:如何知道你的應用程序沒有響應?

for (int i = 0; i < SingleR_mustBeWorkedUp._number_of_Requestes; i++) 
{ 
    Random myRnd = new Random(SingleR_mustBeWorkedUp._num_path); 
    while (true) 
    {  
     int k = myRnd.Next(start, end); 
     if (CanRequestBePutted(timeLineR, k, SingleR_mustBeWorkedUp._time_service, start + end) == true) 
     { 
      SingleR_mustBeWorkedUp.placement[i] = k; 
      break; 
     } 
    } 
} 

我在這裏使用一個無限循環,這將結束只有CanRequestBePutted回報true。那麼如何知道該應用程序沒有響應?

有一個解決方案通過控制每個循環的工作時間,但它似乎並不好。而且我無法預測這種情況在每種情況下都會發生。

任何解決方案?

+0

你的代碼看起來不對,特別是'if'和if後面的代碼(例如'break')。 – crashmstr

+1

迴應_what_?它的代碼不是_hung_,它只是持續循環直到'CanRequestBePutted'返回true。在什麼情況下會發生> –

+4

如果應用程序停止響應,應用程序將不再響應,我不確定您期望什麼樣的答案。這不是一個無限循環:它將在第一次迭代結束時突破「while」。 –

回答

5

如果您擔心此操作可能需要足夠長的時間才能讓應用程序的用戶注意到,則應該在非UI線程中運行它。那麼你可以確定它不會讓你的應用程序沒有任何說服力。你只應該在UI線程中運行它,如果你是肯定它會總是完成非常快。如有疑問,請轉到非UI線程。

不要試圖弄清楚操作是否需要很長時間。如果需要一段時間,請在另一個線程中完成工作。

0

爲什麼不使用一個任務或線程池,所以你沒有阻塞,並把計時器呢?

的任務可能是這個樣子:

//put a class level variable 
static object _padlock = new object(); 

var tasks = new List<Task>(); 
for (int i = 0; i < SingleR_mustBeWorkedUp._number_of_Requestes; i++) 
{ 
    var task = new Task(() => 
     { 
      Random myRnd = new Random(SingleR_mustBeWorkedUp._num_path); 
      while (true) 
      { 
       int k = myRnd.Next(start, end); 
       if (CanRequestBePutted(timeLineR, k, SingleR_mustBeWorkedUp._time_service, start + end) == true) 
       { 
        lock(_padlock) 
         SingleR_mustBeWorkedUp.placement[i] = k; 
        break; 
       } 
      } 
     }); 
    task.Start(); 
    tasks.Add(task); 
} 
Task.WaitAll(tasks.ToArray()); 

不過,我也想嘗試想出一個辦法拿出你的,而(真),這是一個有點危險。此外任務需要.NET 4.0或更高版本,我不確定你的目標是什麼框架。

如果您需要更舊的東西,可以使用ThreadPool。

此外,您可能希望在共享資源(如SingleR_mustBeWorkedUp.placement或其他位置可能正在更改變量)中放置鎖。我以SingleR_mustBeWorkedUp.placement爲例,

+0

這個代碼就像殭屍一樣僵化。另外,還不清楚循環的迭代是否應該並行運行。在這種情況下,它們可能沒有被設計爲線程安全。 – Servy

+0

由於while循環會死鎖嗎? –

+0

不是。它當然不會。只要給定的條件檢查返回true,while循環就會被打破。 – Servy

相關問題