2014-03-28 123 views
0

我有一个应用程序在单个线程上运行,但执行了很多操作(在循环中执行方法以自动执行webbrowser应用程序)。停止执行任何方法而不关闭应用程序

我是一名初学者,所以代码可能组织性很差,但我需要为程序添加一个以下功能 - 一个STOP按钮。

它需要做的只是发送'return'到任何将要或将要执行的方法,以便程序返回到准备和等待阶段(即,我不会丢失用户提供的数据,但是没有执行任何循环的其他迭代等)。

有什么想法?

我试过System.Threading.Thread.CurrentThread.Abort();但这实际上杀死了整个应用程序。任何想法,一个好的通用解决方案?

干杯!

+0

长时间运行的方法不应该在UI线程上执行。 – itsme86

+0

有趣的是你提到了线程,因为你很可能想要使用另一个线程。 –

+0

我建议将线程放在自己的进程中,如果需要停止线程,请停止进程。 – ryrich

回答

1

首先,如果您只是在您的应用程序中使用一个线程。然后你不能发送cancelToken到你的方法。但是,如果你开始使用任务,这是线程,那么你可以提供自己的方法使用cancelTokens的能力。

这是一个非常简单的例子,我写了一个在线程程序中使用cancelToken的例子。

class Program 
{ 
    static void Main(string[] args) 
    { 
     bool cancelToken = false; 
     Thread t = new Thread(new ThreadStart(() => 
     { 
      while (!cancelToken) 
      { 
       Console.WriteLine("Running...."); 
       Thread.Sleep(1000); 
      } 
     })); 

     t.Start(); 
     Console.ReadKey(); 
     cancelToken = true; 
     t.Join(); 
    } 
} 
+0

你好,谢谢你的代码片段。我试过这样的事情,但是我很快遇到了一个异常。我不知道如何实施。我的程序的结构是一个启动按钮触发一系列数十种方法的方式 - 在按下启动按钮后不久,我得到一个错误,称某个方法是从不同的线程或其他东西调用的...让我在第二个 – Bartosz

+0

'跨线程操作无效:从其创建的线程以外的线程访问控制'kryptonPanel1'.'这就是消息 – Bartosz

+0

@Bartosz所以你试图访问KryptonPanel中的东西,而不是从创建KryptonPanel对象的那个。在没有看到您的代码的情况下,我可以为您提供有关如何进行线程安全调用的参考。 http://msdn.microsoft.com/en-us/library/ms171728.aspx 如果您向我提供您的代码,我将能够更好地为您提供帮助。 – IdahoSixString

0

如果你有一个单线程的GUI程序,那么当它处理某些东西时你不能接受任何用户命令。如果你像其他人所建议的那样做,并将处理转储到工作线程中,那么你可以发送一个中断信号给该线程来停止它。

相关问题