C# backgroundWorker сообщает о строке?

Много людей прокомментировало, что это - по сути неразрешимая проблема в теории. Достаточно ярмарка, но кроме того, даже решая его для любого, но большинства тривиальных случаев, казалось бы, была бы невероятно трудной.

Говорят, что у Вас есть программа, которая имеет ряд вложенных циклов, каждого на основе количества объектов в массиве. O (n^2). Но что, если внутренний цикл только выполняется в очень определенном стечении обстоятельств? Скажите, в среднем, это выполняется в приблизительном журнале (n) случаи. Внезапно наш, "очевидно", O (n^2) алгоритм действительно O (n, регистрируют n). Запись программы, которая могла определить, будет ли внутренний цикл выполнен, и как часто, является потенциально более трудной, чем исходная проблема.

Помнят, что O (N) не является богом; высокие константы могут и изменять игровую площадку. Алгоритмы Quicksort являются O (n, регистрируют n), конечно, но когда рекурсия становится достаточно небольшой, скажите вниз приблизительно 20 объектам, много реализаций quicksort изменят тактику на отдельный алгоритм, поскольку это на самом деле более быстро, чтобы сделать другой тип вида, сказать вид вставки с худшим O (N), но намного меньшая константа.

Так, поймите свои данные, выскажите образованные предположения и тест.

10
задан 17 August 2009 в 17:30
поделиться

4 ответа

Я предполагаю, что WCF также имеет метод

public void ReportProgress(int percentProgress, Object userState); 

Поэтому просто используйте userState, чтобы сообщить о строке.

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
 //report some progress
 e.ReportProgress(0,"Initiating countdown");

// initate the countdown.
}

И вы получите эту строку «Инициирование обратного отсчета» обратно в событии ProgressChanged

private void worker_ProgressChanged(object sender,ProgressChangedEventArgs e) 
{
  statusLabel.Text = e.UserState as String;
}
24
ответ дан 3 December 2019 в 14:06
поделиться

Вы можете использовать параметр userState метода ReportProgress , чтобы сообщить об этих строках.

Вот пример из MSDN:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // This method will run on a thread other than the UI thread.
    // Be sure not to manipulate any Windows Forms controls created
    // on the UI thread from this method.
    backgroundWorker.ReportProgress(0, "Working...");
    Decimal lastlast = 0;
    Decimal last = 1;
    Decimal current;
    if (requestedCount >= 1)
    { AppendNumber(0); }
    if (requestedCount >= 2)
    { AppendNumber(1); }
    for (int i = 2; i < requestedCount; ++i)
    {
        // Calculate the number.
        checked { current = lastlast + last; }
        // Introduce some delay to simulate a more complicated calculation.
        System.Threading.Thread.Sleep(100);
        AppendNumber(current);
        backgroundWorker.ReportProgress((100 * i) / requestedCount, "Working...");
        // Get ready for the next iteration.
        lastlast = last;
        last = current;
    }

    backgroundWorker.ReportProgress(100, "Complete!");
}
9
ответ дан 3 December 2019 в 14:06
поделиться

Читать Простая многопоточность в Windows Forms .

Это серия из трех частей.

4
ответ дан 3 December 2019 в 14:06
поделиться

используйте делегата.

]
0
ответ дан 3 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: