Повысить производительность с помощью асинхронного вызова веб-метода? - PullRequest
0 голосов
/ 26 августа 2011

Основным направлением проекта, который я сейчас выполняю, является создание функции автоматизации Excel (CEF), которая позволяет пользователю получать соответствующие данные на основе предоставленных параметров в функции.CEF будет заполнять ячейку везде, где пользователь использует следующую формулу: " = CEF (id, [param1], [param2], ... "

public string CEF(string id, string param1 = "", string param2 = "", string param3 = "", string param4 = "") 
{ 
    return results; 
}

За ним стоит сетьметод (getDataString()), который предоставляется и вызывается CEF, чтобы он мог получать результаты из базы данных через веб-сервис.

В исходной реализации я использовал синхронизированный подход для вызова Интернетаметод, который оказался довольно проблематичным. Excel заморозился, пока все результаты не были возвращены.

Поэтому я решил попробовать использовать Асинхронный подход здесь ( пример Iследовал ), но на самом деле это дает мне новую проблему - CEF всегда возвращает ноль.

void getDataStringCompleted(object sender, getDataStringCompletedEventArgs args)
{
    results = args.Result;
}

Я думаю, причина, по которой я всегда получаю нули, вероятно, потому что CEF всегда получает ударсначала и, следовательно, возвращает пустую строку. В настоящее время я вроде застрял и не знаю, куда идти. Может кто-нибудь помочь или дать мне несколько указателей? Большое спасибо.

РЕДАКТИРОВАТЬ:

Когда я отлаживал свою компаниюде, я обнаружил, что код для подключения события, вероятно, не работает правильно.

public string CEF(string id, string param1 = "", string param2 = "", string param3 = "", string param4 = "") 
{ 
    MyWebservice service = new MyWebservice();

    //Hookup async event handler
    service.getDataStringCompleted += new 
        getDataStringCompletedEventArgs(this.getDataStringCompleted); // <=problem 
    service.getDataStringAsync(id,param1, param2, param3, param4); // <=problem
    return results; 
}

Интересно, можно ли как-нибудь сначала вызвать getDataStringCompleted, присвоить значения переменной results, а затем вернуть ее в методе CEF.

Ответы [ 3 ]

1 голос
/ 29 августа 2011

Ну, первая проблема в том, что вы возвращаете results внутри CEF, когда их нет.

public string CEF(string id, string param1 = "", string param2 = "", string param3 = "", string param4 = "") 
{ 
    MyWebservice service = new MyWebservice();

    //Hookup async event handler
    service.getDataStringCompleted += new 
        getDataStringCompletedEventArgs(this.getDataStringCompleted); 
    service.getDataStringAsync(id,param1, param2, param3, param4); 
    return results; // <- Isn't set yet!
}

В асинхронном вызове вы не можете вернуть результаты изгде вы вызываете метод.Это обработчик событий, который будет иметь результаты, всякий раз, когда он запускается.В вашем случае вы возвращаете results до того, как обработчик событий установил его.CEF в этом случае не сможет вернуть значение.Ваш обработчик событий должен будет получить значение и поместить его в соответствующую ячейку.

Иногда при работе с OFfice намного сложнее заставить асинхронную работу работать правильно.Это один из тех времен, к сожалению.Я не совсем уверен, как бы вы решили это, если Excel нужно CEF, чтобы вернуть значение, потому что вам придется блокировать так или иначе, пока вы не получите его обратно из службы (и самый простой способ сделать этоэто просто назвать это синхронно).

0 голосов
/ 26 августа 2011

Что касается вопроса, думаю, вы найдете то, что вам нужно здесь .

0 голосов
/ 26 августа 2011

Лично, когда есть необходимость в потоковой передаче данных непосредственно в электронную таблицу, я являюсь поклонником функции RTD. В этом случае это, вероятно, будет излишним. [Хорошая статья о RTD: http://support.microsoft.com/kb/285339]

Когда вы сказали, что ваша функция возвращает "null" - обновляете ли вы электронную таблицу через несколько секунд или минут [F9], а значения по-прежнему не предоставляются?

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