无法控制来自不同方法的线程WPF C#

时间:2015-08-31 09:52:01

标签: c# wpf multithreading

我正在写一个小型键盘记录器来获取有关我打字的一些统计信息。 键盘记录工作正常,但现在我想将它实现为wpf以获得更好的控制。

public MainWindow()
{
    InitializeComponent();
    Thread ThreadLog = new Thread(Log);
    Thread ThreadRefreshForm = new Thread(refreshForm);
    Thread ThreadAutoSave = new Thread(AutoSave);
    ThreadLog.Start();
    ThreadRefreshForm.Start();
    ThreadAutoSave.Start();
}

private void btn_ThreadLogStop_Click(object sender, RoutedEventArgs e)
{
    if (ThreadLog.IsAlive == true)
    {
        ThreadLog.Abort();
    }

这给了我一个错误@ ThreadLog.IsAlive。我该如何解决这个问题? 谢谢你的帮助!!!!

2 个答案:

答案 0 :(得分:2)

您应该在其他地方声明ThreadLog并在构造函数中初始化它,以便该方法可以访问ThreadLog

private Thread ThreadLog;

public MainWindow()
{
    InitializeComponent();
    ThreadLog = new Thread(Log);
    ...
}

private void btn_ThreadLogStop_Click(object sender, RoutedEventArgs e)
{
    if (ThreadLog.IsAlive == true)
    {
        ThreadLog.Abort();
    }

答案 1 :(得分:1)

一般来说,如何结束线程的正确方法就是这样

private volatile bool m_Stop;           

public void ThreadLoop()
{
  while(!m_Stop) {
    // do some work
  }
}

// starting
new Thread(ThreadLoop).Start();

// "force" end
m_Stop = true;

或者如果您喜欢线程上的任务(我这样做):

public void ThreadLoop(CancellationToken token)
{
  while(!token.IsCancellationRequested)
  {
    // do some work
  }
}

var cancelation = new CancellationTokenSource();
// starting
new Task(() => ThreadLoop(cancelation.Token), cancelation.Token).Start();
// "force" end
cancelation.Cancel();