2012-02-01 6 views
0

У меня есть приложение WPF, написанное на C#. Он делает вызов службы WCF, которую я написал. Иногда службе WCF может потребоваться до 20 секунд для возврата (в зависимости от необходимости обновления данных). Я знаю, что могу заставить службы WCF поддерживать асинхронные вызовы, но другое решение, которое, как я думал, будет работать, - это превратить вызов службы WCF в новый поток. Я сделал это с помощью следующего кода:Нить не работает асинхронно

new System.Threading.Thread(
    new System.Threading.ThreadStart(
    delegate() 
    { 
     Action del = delegate() 
     { 
      MyService.MyServiceClient ms = new MyService.MyServiceClient(); 
      lblTotalCost.Text = ms.GetTotalCost().ToString("C"); 
     }; 

     this.Dispatcher.BeginInvoke(del); 
    })).Start(); 

я это в функции конструктора одного из моих UserControls, после InitializeComponent().

Без него приложение не будет отображаться до завершения вызова службы. Я надеюсь, что добавление этого приведет к тому, что приложение появится сразу и что метка будет заполняться после завершения вызова службы. К моему удивлению, этого не произошло. Приложение по-прежнему не появляется до завершения вызова службы.

Как это необходимо изменить, чтобы оно выполняло то, что я намеревался сделать?

Спасибо!

ответ

3

С помощью Dispatcher вы положили все Работы на UI-резьбе. Должно быть сделано только назначение lblTotalCost.Text.

MyService.MyServiceClient ms = new MyService.MyServiceClient(); 
var value = ms.GetTotalCost().ToString("C"); 

this.Dispatcher.BeginInvoke(new Action(() => lblTotalCost.Text = value)); 
+0

Намного лучше! Благодаря! Думал, что это может быть так, но не хотел просто реализовывать изменения, не понимая, что происходит или подтверждает, что теория верна. Цените помощь! – Nullqwerty

2

Вы создаете другой поток, который сразу же вызывает обратно в поток пользовательского интерфейса, чтобы сделать фактическую работу (через тот Dispatcher.BeginInvoke вызов).

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

new System.Threading.Thread(
new System.Threading.ThreadStart(
delegate() 
{ 
    MyService.MyServiceClient ms = new MyService.MyServiceClient(); 
    var v = ms.GetTotalCost(); 
    Action del = delegate() 
    { 
     lblTotalCost.Text = v.ToString("C"); 
    }; 

    this.Dispatcher.BeginInvoke(del); 
})).Start();