2015-01-07 1 views
-2

Вот как мой код настроен. Однако я получаю исключение при обновлении myUIElement в Method2.Знаменитый вызывающий поток не может получить доступ к этому объекту, потому что другая проблема

«вызывающий поток не может получить доступ к этому объекту, потому что другой нить владеет.

Если что-нибудь после AWAIT всегда можно назвать на UI потоке? Что я здесь делаю неправильно?

private async void Method1() 
     { 

    // I want to wait until Method2 is completed before doing anything else in Method1 
      await Task.Factory.StartNew(() => Method2()); 

     } 

private async void Method2() 
     { 
      // Reading few things from configuration etc 
       await Task.Factory.StartNew(() => SomeAPILoadDataFromSomewhere()); 
       myUIElement.Text = "something useful has happened"; 


      } 
     } 

ответ

3

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

Также обратите внимание, что в качестве обработчиков событий верхнего уровня должны быть только методы async void. Любой метод async, который вы намереваетесь до await, должен вернуть Task.

Как правило, вы должны использовать Task.Run вместо StartNew, где это возможно.

//This should return a Task and not void if it is used by another asynchronous method 
private async void Method1() 
{ 
    await Method2(); 
    DoSomethingElse(); 
} 

private async Task Method2() 
{ 
    await Task.Run(() => SomeAPILoadDataFromSomewhere()); 
    myUIElement.Text = "something useful has happened";    
} 
+0

Это вызывает зависание приложения в Method2, когда пользовательский интерфейс был взломан. – BKS

+0

@johnsmith Тогда вы не вызываете 'Method1' из потока пользовательского интерфейса, и вы должны быть. Или вы блокируете поток пользовательского интерфейса, когда вы не должны блокировать поток пользовательского интерфейса. – Servy

+1

Жаль, что это было плохо. Он работал как диаграмма – BKS

Смежные вопросы

 Смежные вопросы