2016-12-18 30 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中启用/禁用按钮时已经设置了侦听器。 –