вторник, 11 августа 2015 г.
Показ окна в отдельном потоке
четверг, 19 сентября 2013 г.
Что делать, если запуск потоков зависит от событий, которые не реализуют уведомления?
Задача состоит в том, что есть внешний источник информации, который говорит нам сколько потоков запускать, также там есть информация о том, готово ли все для запуска или нет. Если таким источником данных является MS SQL сервер, то узнать о том, что там поменялась информация мы можем только обратившись за ней сами. Все, перехожу к примеру.
четверг, 5 сентября 2013 г.
"Медленные" свойства
А там будет общая информация о свойствах , но, самое главное будет о том, что делать, если свойство "медленное", т.е. на присвоение или чтение надо очень много времени.
воскресенье, 3 марта 2013 г.
Упрощения жизни в примере показа всплывающих сообщений
среда, 14 ноября 2012 г.
Как заставить async метод вести себя как синхронный
вторник, 16 октября 2012 г.
Про непонимание новомодных штук и к чему это приводит
среда, 12 сентября 2012 г.
Синтаксический сахар async и await
пятница, 1 июня 2012 г.
Часть 6. Многопоточность на примере матричного фильтра - размытие
пятница, 25 мая 2012 г.
Часть 5. События синхронизации
понедельник, 21 мая 2012 г.
Часть 4. Способы синхронизации потоков в .Net
вторник, 15 мая 2012 г.
Часть 3. Гонки и тупики
суббота, 12 мая 2012 г.
Часть 2. Процессы и потоки
Давайте решим нашу задачу поиска элемента, но только не в массивах, а в файлах. Применять будем параллелизм задач, т.к. он для процессов его проще применить (у разных процессов нет общей памяти, а передача информации из процесса в процесс достаточно сложна).
пятница, 11 мая 2012 г.
Часть 1. История развития параллельной обработки и классификация современных подходов
Одним из принципов предложенным в этой статье, был принцип «Последовательного программного управления», который гласит: «Программа состоит из набора команд, которые выполняются процессором автоматически друг за другом в определенной последовательности». И этот постулат, надолго определил основное направление развития процессоров, да и вычислительной техники. И только относительно недавно, когда увеличивать тактовую частоту процессоров стало технологически не выгодно, основные взоры обратились из последовательного выполнения команд, в параллельное.
вторник, 27 марта 2012 г.
Async и await

четверг, 22 марта 2012 г.
Task-и в C#
среда, 23 ноября 2011 г.
О том как в C# применить dynamic
понедельник, 23 ноября 2009 г.
Создание окна из потока отличного от потока диспетчера приложения
public void StartReadFromScala(Guid idWorkflow)
{
WndReadFromScala form = new WndReadFromScala();
form.Show();
}
* This source code was highlighted with Source Code Highlighter.
Выполнялось, но форма не появлялась :(
Пришлось пойти на следующее ухищрение:
public void StartReadFromScala(Guid idWorkflow)
{
// Создаем форму для ввода данных, но создаем ее в главном потоке
Application.Current.Dispatcher.Invoke(new NoParamHandler(CreateWndReadFromScala), new object[] { });
}
private void CreateWndReadFromScala()
{
WndReadFromScala form = new WndReadFromScala();
form.Show();
}
* This source code was highlighted with Source Code Highlighter.
А вот теперь все работает ;)
вторник, 19 мая 2009 г.
Многопоточный доступ в WPF
Одной из проблем при работе в WPF с визуальными компонентами заключается в том, что доступ к ним из любого потока отличного от их породившего приводит к исключению.
Для примера возьмем простое приложение, со следующим интерфейсом:
При нажатии на кнопку "Старт" запускается длительная операция выводящая состояние процесса в ProgressBar.
Код метода длительной операции для простоты возьмем вот такой:
private int LongOperation()
{
for (int i = 0; i < 100; i++)
{
// Имитация полезной работы
Thread.Sleep(100);
// Сообщаем в визуальную часть, что часть работы выполнена
SetProgressBarValue(i + 1);
}
return 0;
}
* This source code was highlighted with Source Code Highlighter.
Обработчик клика на кнопке:
private void startButton_Click(object sender, RoutedEventArgs e)
{
Func<int> operation = LongOperation;
operation.BeginInvoke(null, null);
}
* This source code was highlighted with Source Code Highlighter.
При попытке реализовать метод SetProgressBarValue в лоб:
private void SetProgressBarValue(int newValue)
{
workProgress.Value++;
}
* This source code was highlighted with Source Code Highlighter.
мы получим InvalidOperationException
Для решения этой проблемы необходимо воспользоваться замечательным классом Dispatcher, переписав с его помощью код, мы получим:
// Делегат для перевызова метода SetProgressBarValue через диспетчер
private delegate void SetProgressBarValueHandler(int newValue);
private void SetProgressBarValue(int newValue)
{
// Проверяем совпадает ли поток диспетчера с потоком вызвавшим метод
if (Dispatcher.Thread == Thread.CurrentThread)
{
// Все замечательно :) меняем значение прогресбара
workProgress.Value = newValue;
}
else
{
// Нет :( все плохо :( перезапускаем метод в потоке диспетчера
Dispatcher.Invoke(new SetProgressBarValueHandler(SetProgressBarValue), new object[] { newValue });
}
}
* This source code was highlighted with Source Code Highlighter.
Вуаля, все заработало :)
Проект можно скачать здесь: MultithreadingWPF.rar