2013-06-06 3 views
1

У меня есть следующий класс:Запуск метода и обновления ProgressBar с помощью TPL

class MyClass 
{ 
    public void timeConsumingCode(){ 
     for(int i=0; i<100; i++) 
     { 
      Threading.Thread.Sleep(1000); 
     } 
    } 
} 

, а затем у меня есть мой Form1 код:

private void btn_RunTimeConsumingCode_Click(object sender, EventArgs e) 
{ 
    Task loadMasterFile = Task.Factory.StartNew(() => 
    { 
     MyClass myclass = new MyClass(); 
     myClass.timeConsumingCode(); 
    }); 
} 

до сих пор все работает отлично. Однако я добавил индикатор прогресса в форме, и я хочу обновить его на основе значения i. если i=34, то 34% сделано.

Я мог бы invoke свойство индикатора выполнения из timeConsumingCode() изменить значение, но я хочу, чтобы класс был как можно более независимым от формы, чтобы в будущем его можно было портировать в другие приложения.

Есть ли способ, которым я могу изменить значение моей панели прогресса, не заставляя MyClass зависеть от формы1?

Я надеюсь, что было достаточно ясно

+1

Если это WinForms, класс «BackgroundWorker» отлично подходит для сценария такого типа: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx – DonBoitnott

ответ

3

TPL в .net Framework 4.5 имеет IProgress<T> интерфейс, который реализован в виде Progress<T>. В вашем случае, как вам нужно одно число, как доклад о ходе работы вы могли бы использовать Progress<int> экземпляр и присоединить обработчик события к его ProgressChanged событию, по этим линиям:

private void btn_RunTimeConsumingCode_Click(object sender, EventArgs e) 
{ 
    Progress<int> progress = new Progress(p => {...ui handling code ...}); 

    Task loadMasterFile = Task.Factory.StartNew(() => 
    { 
     MyClass myclass = new MyClass(); 
     myClass.timeConsumingCode(progress); 
    }); 
} 

в сочетании с вызовом

progress.Report(someNumber); 

в соответствующих местах в методе MyClass.timeConsumingCode.

Конечно, обработчик события (здесь заданный как аргумент конструктора) называется асинхронным.

+0

cool, haven ' t заметил «Прогресс » класс раньше. – Giedrius

+0

Есть хороший документ об асинхронном шаблоне задачи [здесь] (http://www.microsoft.com/en-us/download/details.aspx?id=19957), который подробно рассказывает об этом. – SWeko

+0

@SWeko это определенно направление, в которое я хочу войти! Однако я смущен относительно того, как я буду кодировать код обработки ... ui ... другими словами, как бы установить значение maxvalue и новое значение для индикатора выполнения? – Krimson