интересное служебное поведение в серебряном свете - PullRequest
1 голос
/ 24 февраля 2011

У меня есть проект Silverlight, который получает некоторую зашифрованную строку через ссылку на службу: DataService (служба, которая выполняется в проекте ASP.NET).

Метод из TransactionServices.cs для получения зашифрованной строки::

 public void GetEncryptedString(string original)
    {
        DataService.DataServiceClient dataSvc = WebServiceHelper.Create();
        dataSvc.GetEncryptedStringCompleted += new EventHandler<SpendAnalyzer.DataService.GetEncryptedStringCompletedEventArgs>(dataSvc_GetEncryptedStringCompleted);
        dataSvc.GetEncryptedStringAsync(original);
    }

По завершении поместите результат в encodedString var (который инициализируется пустым значением):

void dataSvc_GetEncryptedStringCompleted(object sender, SpendAnalyzer.DataService.GetEncryptedStringCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            try
            {
                if (e.Result == null) return;
                this.encodedString = e.Result;
            }
            catch (Exception ex)
            {
                Logger.Error("TransactionService.cs: dataSvc_GetEncryptedStringCompleted: {0} - {1}",
                    ex.Message, ex.StackTrace);
                MessageBox.Show(ex.ToString());
            }
        }
    }

Теперь я хочу получить закодированную строку из моей главной страницы.xaml вроде:

TransactionService ts = new TransactionService();
                    ts.GetEncryptedString(url);
                    Console.WriteLine(ts.encodedString);

Я не понимаю, почему ts.encodedString пуст.Когда я делаю отладку, я вижу, что он на самом деле печатает пустой и ПОСЛЕ того, что он идет в void dataSvc_GetEncryptedStringCompleted, чтобы взять результат и заполнить его.

Можете ли вы указать мне, что я сделал не так?Есть ли способ дождаться извлечения encodedString и только после этого продолжить?

Большое спасибо.

1 Ответ

0 голосов
/ 24 февраля 2011

Когда вы вызываете ts.GetEncryptedString(url);, вы только что начали асинхронную операцию.И поэтому значение, к которому вы обращаетесь, будет установлено только в методе обратного вызова.

Но вы получите доступ к нему до изменения значения обратным вызовом.

Решение, которое я использую, будет выглядетьаналогично следующему:

Переопределить сигнатуру метода GetEncryptedString.

public void GetEncryptedString(string original, Action callback)
    {
        DataService.DataServiceClient dataSvc = WebServiceHelper.Create();
        dataSvc.GetEncryptedStringCompleted += (o,e) => 
{
dataSvc_GetEncryptedStringCompleted(o,e); 
callback(); 
}            
        dataSvc.GetEncryptedStringAsync(original);
    }

Вызвать его так:

ts.GetEncryptedString (url, OtherLogicDependantOnResult);

где

OtherLogicDependantOnResult равен

void OtherLogicDependantOnResult()
{
//... Code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...