gpt4 book ai didi

c# - 按名称杀死线程

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:20 28 4
gpt4 key购买 nike

我的线程有问题...

Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate {}));
Thread.Sleep(90);

它启动并运行良好,但就像永远一样,我不想永远运行这个线程。有没有可能给这个线程一个名字,这样我就可以随时按名字杀死它?我尝试用以下方法杀死它:

Dispatcher.CurrentDispatcher.thread.Abort();

但它杀死了整个应用程序...基本上...我的 WPF 应用程序中有一个自定义组合...此线程处于 while 循环中,当我打开组合时会启动一个循环 while(!context.IsClosed) 但是当它关​​闭时,它仍在后台运行

最佳答案

您对多线程方法的理解是完全错误的。

首先,不,没有办法为以这种方式调用的线程命名。
其次,在这种情况下,终止线程是一种完全错误的方法,有一种简单的方法可以做到这一点:CancellationToken .你可以使用一些 overloads for the Dispatcher.Invoke与他们一起(使用或不使用启动超时),像这样:

Dispatcher.Invoke Method (Action, DispatcherPriority, CancellationToken) :

CancellationTokenSource s = new CancellationTokenSource();
Dispatcher.CurrentDispatcher.Invoke(() => YourMethodHere(), DispatcherPriority.Background, s.Token);
Thread.Sleep(90);

s.Cancel();

调用Cancel后方法 .NET 将自动停止您的线程。

第二种可能的方法,如评论中所写,是使用 TPL为此,在不使用 Thread 创建的情况下,像这样(来自 MSDN article about SynchronizationContext 的代码):

  // This TaskScheduler captures SynchronizationContext.Current.
TaskScheduler taskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
// Start a new task (this uses the default TaskScheduler,
// so it will run on a ThreadPool thread).
Task.Factory.StartNew(() =>
{
// We are running on a ThreadPool thread here.
// Do some work.
// Report progress to the UI.
Task reportProgressTask = Task.Factory.StartNew(() =>
{
// We are running on the UI thread here.
// Update the UI with our progress.
},
s.Token,
TaskCreationOptions.None,
taskScheduler);
reportProgressTask.Wait();

// Do more work.
});

关于c# - 按名称杀死线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30455340/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com