У кого-нибудь есть хороший пример многопоточного вызова? - PullRequest
0 голосов
/ 23 июня 2011

У меня есть функция LoadData с огромным количеством элементов управления WinForm, и она загружает данные из базы данных в элемент управления.Теперь это стало очень медленно, если я буду использовать многопоточность, если да, то, пожалуйста, предложите хороший образец, я уже пробовал MSDN образец

Но это не полезно для меня, это потребует многоизменений в моем коде.

Ответы [ 3 ]

1 голос
/ 23 июня 2011

Я предполагаю, что у вас много кода, который взаимодействует с пользовательским интерфейсом, и вы хотите сделать это из фонового потока.

Вы можете добавить метод, подобный этому:

private static void UpdateControl(Control control, Action action)
{
    if (control.InvokeRequired)
        control.Invoke(action);
    else
        action();
}

Использование:

Старый

 textBox.Text = "Something";

New

 UpdateControl(textbox, () => { textBox.Text = "Something" });

Или метод расширения, чтобы сократить использование

public static class ControlExtension
{
    public static void UpdateControl(this Control control, Action<Control> action)
    {
        if (control.InvokeRequired)
            control.Invoke((Action)(() => action(control)));
        else
            action(control);
    }
}

Использование:

textBox.UpdateControl(arg => arg.Text = "Something");
0 голосов
/ 23 июня 2011

Извлечение BackgroundWorker

var bw = new BackgroundWorker();
bw.DoWork += (s, e) => e.Result = getAllBoxers();
bw.RunWorkerCompleted += (s, e) =>
    {
        var boxers = e.Result as List<Boxer>;
        dgvBoxers.DataSource = boxers;
    };
bw.RunWorkerAsync();

Никогда не делайте ничего, что влияет на GUI в DoWork, потому что WinForms не безопасен для потоков.

0 голосов
/ 23 июня 2011

Вы можете использовать TPL в .NET 4, чтобы справиться с этим потенциально более простым способом. Все, что вам нужно сделать, это обойти соответствующий TaskScheduler. С TaskScheduler, созданным из контекста пользовательского интерфейса, любой вызов может быть легко помещен в Task, который будет выполняться в потоке пользовательского интерфейса по мере необходимости.

Подробнее см. В моем блоге на эту тему .

...