Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

BackgroundWorker - ваш друг.

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

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

Но если вы используете Visual Studio, сгенерированный клиентский класс имеет сигнатуры асинхронных методов, которые сделают это за вас. Если ваш метод " 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top