2015-04-15 2 views
0

У меня есть приложение-приложение, которое регулярно выполняет импорт/экспорт каждые X минут.Как получить уведомление о завершении ThreadPool?

части импорта требует времени (например, 60 секунд) и избежать замораживания моего полного приложения (у меня есть лог-экран внутри, чтобы увидеть, что происходит), я реализовал Threading моего Worker:

/// <summary> 
    /// Eigentlicher JobTimer Tick, schmeißt den Worker jeden Tick neu an. 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void JobTimer_Tick(object sender, EventArgs e) 
    { 
     WriteLog("Jobtimer Tick"); 
     JobTimer.Enabled = false; 
     ThreadPool.QueueUserWorkItem(StartWorker); 

    } 

    /// <summary> 
    /// StartWorker Wrapper for Threading 
    /// </summary> 
    /// <param name="state"></param> 
    private void StartWorker(object state) 
    { 
     Worker w = new Worker(); 
     w.StartWork(); //<--- Jobs will be Done here 
     JobTimer.Enabled = true; //<---Problem here 
    } 

Моей проблемы is, я должен отключить JobTimer (который отметит каждые 1000 мс, чтобы увидеть, есть ли задание todo), поэтому JobTimer не переполняется заданиями, которые в настоящее время работают. Но я не могу включить его снова, потому что кажется, что JobTimer в поточном методе не совпадает с методом вызова ...

Итак, как я могу получить уведомление, когда мой Async ThreadPool закончен?

+0

Обычный способ вы можете сообщить одну нить о том, что происходит в другом потоке - использовать конструкцию сигнализации. Конечно, сейчас это пустая трата времени. Почему бы не использовать 'BackgroundWorker' или' Task' (особенно с 'await') вместо этого? – Luaan

ответ

2

Новые функции async/await, основанные на задачах, значительно облегчают это выражение. Как насчет сосисок таймера и пересчет вашей проблемы при задач:

Итак:

public async Task RunWorkLoop(CancellationToken token) 
{ 
    while(!token.IsCancellationRequested) 
    { 
     //runs in ThreadPool, doesn't complete until StartWork is done 
     await Task.Run(() => new Worker().StartWork()); 
     await Task.Delay(someTimeInterval); 
    } 
} 
+0

Вы можете добавить примечание, что 'Task.Delay' также использует таймер, поэтому он абстрагирует довольно много эквивалентный код. Хотя я предполагаю, что OP использовал winforms 'Timer', а не многопоточный' Timer', так что есть разница - вы больше не возвращаетесь к потоку пользовательского интерфейса. ОП должен сказать, нужно это или нет. – Luaan

+0

Спасибо, не могли бы вы помочь мне приспособить это к моему коду, пожалуйста? – Kovu

Смежные вопросы