Не отвечающее окно

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

Я не хочу вызывать метод из другого потока.

Это лучший способ справиться с этим?

Среда: C#, веб-сервис


person Buzz    schedule 29.10.2009    source источник


Ответы (3)


Вы можете сделать запрос в отдельном потоке, который оставит поток пользовательского интерфейса отзывчивым. После завершения вам нужно будет синхронизировать ответ с потоком пользовательского интерфейса.

person Fenton    schedule 29.10.2009
comment
это обычно происходит, когда я переключаюсь между приложениями - person Buzz; 29.10.2009

BackgroundWorker — ваш друг.

Вот пример того, как я использую BackgroundWorker с WebService . По сути, нет возможности выполнять интенсивные операции на стороне пользовательского интерфейса без использования отдельного потока. BackgroundWorker — лучший способ запуска в отдельном потоке.

person djdd87    schedule 29.10.2009

Чтобы иметь отзывчивый пользовательский интерфейс, вы должны использовать другой поток.

Но если вы используете визуальную студию, сгенерированный клиентский класс имеет сигнатуры асинхронных методов, которые сделают это за вас. Если ваш метод "GetData", то у вас должен быть метод "GetDataAsync", который не замораживал бы ваше окно.

Вот пример:

WsClient client;
protected override void Load() {
    base.Onload();
    client = new WsClient();
    client.GetDataCompleted += new GetDataCompletedEventHandler(client_GetDataCompleted);
}

//here is the call
protected void Invoke()
{
    client.GetDataAsync(txtSearch.Text);
}

//here is the result
void client_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
    //display the result
    txtResult.Text = e.Result;
}
person Manitra Andriamitondra    schedule 29.10.2009
comment
Тогда, не могли бы вы опубликовать код, который поможет нам понять проблему? - person Manitra Andriamitondra; 29.10.2009