C# 无法控制来自不同方法WPF C的线程
我正在写一个小键盘记录程序来记录我打字的数据。 键盘记录器工作得很好,但现在我想将其实现到wpf中以获得更好的控制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
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();