Простая и безопасная реализация многопоточности в WinForms
От: Аноним Крис Селлз  
Дата: 10.06.03 05:40
Оценка: 230 (14) -1 :)
Статья :
Простая и безопасная реализация многопоточности в WinForms
Автор(ы): Крис Селлз (Chris Sells)
Дата: 05.06.2003
В статье рассматривается использование многопоточности в приложениях Windows Forms на примере отображения хода длительной операции с использованием асинхронного делегата для запуска рабочего потока и метода Invoke для главной формы.


Авторы :
Крис Селлз

Аннотация :
Все началось вполне невинно. Мне впервые потребовалось вычислить площадь окружности в .NET. Для этого, естественно, нужно точное значение числа pi. В принципе константа System.Math.PI удобна, но в силу того что ее точность составляет 20 знаков, меня беспокоила точность моих расчетов (для полной уверенности мне хотелось получить точность в 21 знак). И я, как и любой настоящий программист, забыл о своей первоначальной задаче и написал программу для вычисления числа pi с любой точностью. Вот что у меня вышло ...

23.12.03 17:04: Перенесено модератором из '.NET' — AVK
Re: Простая и безопасная реализация многопоточности в WinFor
От: VBez  
Дата: 16.02.04 12:14
Оценка: +1
Повбывав бы за вот такой код :

CalcPiDelegate  calcPi = new CalcPiDelegate(CalcPi);


Это стандарт?
Или все-таки можно как-то поразличнее называть сущности?
Re: Простая и безопасная реализация многопоточности в WinFor
От: Кирилл Осенков Украина
Дата: 10.07.04 14:06
Оценка: 1 (1)
У этой статьи есть два продолжения. Вот все три части на MSDN:

Safe, Simple Multithreading in Windows Forms, Part 1
Safe, Simple Multithreading in Windows Forms, Part 2
Safe, Simple Multithreading in Windows Forms, Part 3
Re[2]: Простая и безопасная реализация многопоточности в Win
От: Spiceman  
Дата: 09.11.05 13:20
Оценка:
Здравствуйте, 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
Re: Простая и безопасная реализация многопоточности в WinFor
От: weakfish  
Дата: 20.12.06 14:47
Оценка:
Здравствуйте, Крис Селлз, Вы писали:

КС>Статья :

КС>Простая и безопасная реализация многопоточности в WinForms
Автор(ы): Крис Селлз (Chris Sells)
Дата: 05.06.2003
В статье рассматривается использование многопоточности в приложениях Windows Forms на примере отображения хода длительной операции с использованием асинхронного делегата для запуска рабочего потока и метода Invoke для главной формы.


Есть у этого подхода один минус — если обрабатывающий поток будет слишком часто обновлять статус, то визуальный компонент будет значительно отставать. На практике это выглядит очень забавно — трид завершился пару секунд назад, а полоска выполнения продолжает двигаться обрабатывая полученные ранее значения.
Re[2]: Простая и безопасная реализация многопоточности в Win
От: Варвар США  
Дата: 27.12.06 14:50
Оценка:
Я из формы асинхронно вызываю через 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
И вместо сердца каменный топор...
Re: Простая и безопасная реализация многопоточности в WinFor
От: Аноним  
Дата: 19.06.08 12:11
Оценка: 3 (1) :)))
Все круто. Но у окружности нету площади.
Площадь имеет место быть у круга.
(окружность — суть линия ограничивающая сам круг)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.