Только ответить на несколько комментариев к моему выше сообщения:
Domenic - я нахожусь на этом сайте, и я забочусь. Не для пользы педантизма, но потому что мы - как программисты - обычно заботимся о точности. Используя O () нотация неправильно в стиле, который некоторые сделали здесь, представляет его довольно бессмысленный; мы можем точно также сказать, что что-то берет единицы времени n^2 в качестве O (n^2) в соответствии с соглашениями, используемыми здесь. Используя O () ничего не добавляет. Это не просто маленькое несоответствие между общим использованием и математической точностью, о которой я говорю, вот в чем разница между ним являющийся значимым и этим нет.
я знаю многих, многие превосходные программисты, которые используют эти термины точно. Говоря, 'о, мы - программисты поэтому, мы не заботимся', унижает целое предприятие.
onebyone - ну, не действительно, хотя я беру Вашу точку. Это не O (1) для произвольно большого n, который является видом определения O (). Это просто идет, чтобы показать, что O () ограничил применимость для ограниченного n, где мы на самом деле говорили бы о количестве сделанных шагов, а не привязанный то число.
Вы можете прочитать эту статью о CodeProject и эту статью в MSDN. В первой статье описывается создание блокирующего модального диалогового окна вручную, а во второй статье показано, как создавать настраиваемые диалоговые окна.
Вы можете превратить вашу функцию в итератор, который возвращает IEnumerator
, а затем записать его вот так:
//some code
yield return new CustomMessageBox("hello world");
//some more code
Затем вы должны написать функцию-оболочку, которая принимает перечислитель и вызывает MoveNext
(который будет выполнять все функции до следующего yield return
) в DialogClosed
обработчики.
Обратите внимание, что функция-оболочка не будет блокирующим вызовом.
Установите еще один цикл сообщений в классе окна сообщений. Что-то вроде:
public DialogResult ShowModal()
{
this.Show();
while (!this.isDisposed)
{
Application.DoEvents();
}
return dialogResult;
}
Если вы посмотрите на Windows.Form в Reflector, вы увидите, что он делает что-то вроде этого ..