2015-05-26 3 views
1

У меня есть проблема с моей темой ...убийство резьбы по имени

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

Он начинает и работает нормально, но, как всегда, и я не хочу, чтобы запустить эту тему навсегда. Есть ли способ дать этой теме имя, чтобы я мог убить его по имени в любое время, которое я хочу? Я попытался убить его:

Dispatcher.CurrentDispatcher.thread.Abort(); 

но убить Вот и вся приложение ... В основном ... У меня есть пользовательский комбо в моем WPF приложение ... этот поток в то время как цикл, когда я открываю комбо начинает цикл while (! context.IsClosed), но когда он закрыт, он все еще работает в фоновом режиме

+4

Это потому, что вы глушения * основной * нить. Вы вызывали делегата непосредственно в потоке пользовательского интерфейса, а затем убивали его. Что ты пытаешься сделать? Почему бы вам не начать фоновый поток с 'Task.Run'? –

+0

Что именно вы пытаетесь сделать? Диспетчер в обычном приложении wpf или windows является основным потоком. Так что убить это убьет ваше приложение. Может быть, вы хотите ThreadPool.QueueUserWorkItem? –

+0

Вы понимаете, что использование 'Dispatcher' таким образом фактически не создает * нить? –

ответ

3

Ваше понимание подхода многопоточности совершенно неверно.

Прежде всего, нет, нет способа указать имя для вашего потока, вызываемого таким образом.
Во-вторых, убийство нитки - совершенно неправильный подход в подобных ситуациях, есть простой способ сделать такие вещи: 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. 
    }); 
Смежные вопросы