2016-12-18 62 views
0

我正在爲自己的用途創建一個小型實用程序,當從文件中讀取時打開瀏覽器中的鏈接。我有一個按鈕,在打開像這樣一個文件的所有鏈接:使用異步時更改winform控件的屬性。線程

private void buttonOpenAll_Click(object sender, EventArgs e) 
    { 
     if (LinksInFile.Count() != 0) 
     { 
      buttonOpenAllCancel.Visible = true; 
      buttonOpenAll.Visible = false; 
      ThreadPool.QueueUserWorkItem(new WaitCallback(OpenAllURL), cts.Token); 

     } 
    } 

這是把調用此:

public static void OpenAllURL(Object obj) 
    { 
     CancellationToken token = (CancellationToken) obj; 
     foreach (var link in LinksInFile) 
     { 
      if (token.IsCancellationRequested) 
      { 
       break; 
      } 
      OpenUrlInChrome(link, false); 
      Thread.Sleep(7500); //to ensure the browser doesn't break 
     } 
    } 

正如你可以看到我有我的WinForm的兩個按鈕,我切換當我開始執行的可見性狀態,可見按鈕時執行這個任務應該是取消按鈕,它看起來像這樣:

private void buttonOpenAllCancel_Click(object sender, EventArgs e) 
    { 
     cts.Cancel(); 
     cts.Dispose(); 
     buttonOpenAll.Visible = true; 
     buttonOpenAllCancel.Visible = false; 
    } 

此代碼按預期工作,直到有人決定不取消 URL的打開,然後取消按鈕仍然可見,你必須按下它,以便再次啓用「全部打開」按鈕。我無法設置OpenAllURL方法內部按鈕的可見性,因爲它在UI中的單獨線程中運行。如果我想在排隊操作完成後啓用「全部打開」按鈕,我有什麼選擇?

回答

0

一個選項是引發一個事件告訴GUI從另一個線程啓用/禁用按鈕。如何做到這一點很好在這裏https://msdn.microsoft.com/en-gb/library/aa645739(v=vs.71).aspx

+0

我不完全知道如何實現這個解決方案與我目前的設置,謹慎詳細說明? – UndyingJellyfish

+0

在您的OpenAllURL方法中,您可以調用一個事件,該事件在GUI中啓用/禁用按鈕時已經設置了偵聽器。 –