Статья :
Простая и безопасная реализация многопоточности в WinFormsАвтор(ы): Крис Селлз (Chris Sells)
Дата: 05.06.2003
В статье рассматривается использование многопоточности в приложениях Windows Forms на примере отображения хода длительной операции с использованием асинхронного делегата для запуска рабочего потока и метода Invoke для главной формы.
Авторы :
Крис Селлз
Аннотация :
Все началось вполне невинно. Мне впервые потребовалось вычислить площадь окружности в .NET. Для этого, естественно, нужно точное значение числа pi. В принципе константа System.Math.PI удобна, но в силу того что ее точность составляет 20 знаков, меня беспокоила точность моих расчетов (для полной уверенности мне хотелось получить точность в 21 знак). И я, как и любой настоящий программист, забыл о своей первоначальной задаче и написал программу для вычисления числа pi с любой точностью. Вот что у меня вышло ...
23.12.03 17:04: Перенесено модератором из '.NET' — AVK
Все круто. Но у окружности нету площади.
Площадь имеет место быть у круга.
(окружность — суть линия ограничивающая сам круг)
Повбывав бы за вот такой код
![](/Forum/Images/smile.gif)
:
CalcPiDelegate calcPi = new CalcPiDelegate(CalcPi);
Это стандарт?
Или все-таки можно как-то поразличнее называть сущности?
Здравствуйте, VBez, Вы писали:
VB>Повбывав бы за вот такой код :-):
VB>VB>CalcPiDelegate calcPi = new CalcPiDelegate(CalcPi);
VB>
VB>Это стандарт?
VB>Или все-таки можно как-то поразличнее называть сущности?
А я вот за такой руки бы оторвал:
if( _pi.InvokeRequired == false )
это взято отсюда
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnforms/html/winforms08162002.asp
Здравствуйте, Крис Селлз, Вы писали:
КС>Статья :
КС>Простая и безопасная реализация многопоточности в WinFormsАвтор(ы): Крис Селлз (Chris Sells)
Дата: 05.06.2003
В статье рассматривается использование многопоточности в приложениях Windows Forms на примере отображения хода длительной операции с использованием асинхронного делегата для запуска рабочего потока и метода Invoke для главной формы.
Есть у этого подхода один минус — если обрабатывающий поток будет слишком часто обновлять статус, то визуальный компонент будет значительно отставать. На практике это выглядит очень забавно — трид завершился пару секунд назад, а полоска выполнения продолжает двигаться обрабатывая полученные ранее значения.
Я из формы асинхронно вызываю через BeginInvoke какую то функцию (допустим ParseExcels из класса Merger), которая может кинуть эксепшин. Как его (эксепшн) поймать?
public override void OnNextButtonClick()
{
...
Merger.LongProcessDelegate proc = new Merger.LongProcessDelegate(_merger.ParseExcels);
proc.BeginInvoke(new AsyncCallback(StepFinished), null);
}
public void StepFinished(IAsyncResult ar)
{
if(this.InvokeRequired)
{
this.Invoke( new AsyncCallback(StepFinished), new object [] { ar } );
}
else
{
...
}
}
PS .Net Framework 1.1