Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法控制来自不同方法WPF C的线程_C#_Wpf_Multithreading - Fatal编程技术网

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

C# 无法控制来自不同方法WPF C的线程,c#,wpf,multithreading,C#,Wpf,Multithreading,我正在写一个小键盘记录程序来记录我打字的数据。 键盘记录器工作得很好,但现在我想将其实现到wpf中以获得更好的控制 public MainWindow() { InitializeComponent(); Thread ThreadLog = new Thread(Log); Thread ThreadRefreshForm = new Thread(refreshForm); Thread ThreadAutoSave = new Thread(AutoSave

我正在写一个小键盘记录程序来记录我打字的数据。 键盘记录器工作得很好,但现在我想将其实现到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。我怎样才能解决这个问题? 谢谢你的帮助

您应该在其他地方声明线程日志,并在构造函数中对其进行初始化,以便该方法可以访问线程日志:


一般来说,结束线程的正确方法如下

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();

您在构造函数中声明了ThreadLog,然后从方法btn\u ThreadLogStop\u单击访问它。ThreadLog在其他地方声明了吗?没有,但是如果我通过构造函数声明它,比如:publicThreadLog=newThreadLog;该程序向我显示了一个错误,例如字段初始值设定项无法引用非静态字段、方法或属性“MainWindow.log”我在log方法中使用了标签和复选框的一些属性。现在该怎么办呢?大惊小怪,你得到的错误是??在类的作用域中声明ThreadLog并在构造函数中初始化如何?你永远不应该调用Thread.Abort。我听说是这样描述的——如果你想停车,就开枪打死司机——汽车会停下来,但你不知道在这个过程中汽车会造成什么损害。在线程上调用.Abort会对应用程序域造成各种损害。调用它的唯一合法时间是在您强制关闭应用程序时。
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();