2014-02-17 2 views
1

В основном, когда мой autocompletetextbox изменяет текст, он обновляет от WCF службы (с фотографиями), проблема заключается в:Создание задачи для ФОС Async, оленья кожа ждут

Task taskA = new Task(() => listanomes.queryAsync(argumentos, 2, 3, query)); 

Задача не запускается, как только я начинаю это, поэтому список, который мне нужен, пуст.

private async void tbA_destinatario_TextChanged(object sender, RoutedEventArgs e) 
{ 
    await buscaAC(); 
    await fotos(); 
    int i = 0; 
    foreach (Pessoa temp in listaPessoas) 
    { 
     if (listaimgs.Count == 0) 
      break; 
     temp.Imagem = listaimgs[i]; 
     i++; 
     listaPessoas[i] = temp; 
    } 
    tbA_destinatario.ItemsSource = listaPessoas; 
} 

private async Task buscaAC() 
{ 
    ServicosLinkedIN.ServicosClient listanomes = new ServicosLinkedIN.ServicosClient(); 
    string query = "select nome,id_user, foto from tbl_conexoes, tbl_users where((tbl_conexoes.id_con2 = @var1 AND id_con1 = id_user) OR (tbl_conexoes.id_con1 = @var1 AND id_con2 = id_user)) AND upper(nome) LIKE upper(@var2) ORDER BY nome LIMIT 0, 5"; 
    List<string> argumentos = new List<string>(); 
    argumentos.Add(Convert.ToString(id)); 
    argumentos.Add("%" + tbA_destinatario.Text + "%"); 

    //listanomes.listautilizadoresAsync(id, tbA_destinatario.Text); 
    listanomes.queryCompleted += listanomesautocomplete; 
    Task taskA = new Task(() => listanomes.queryAsync(argumentos, 2, 3, query)); 
    taskA.Start(); 
    await taskA; 
} 

private async Task fotos() 
{ 
    ServicosLinkedIN.ServicosClient dlfotos = new ServicosLinkedIN.ServicosClient(); 

    dlfotos.listadlFotoCompleted += dlfotos_listadlFotoCompleted; 
    Task taskA = new Task(() => dlfotos.listadlFotoAsync(nomeimgs)); 
    taskA.Start(); 

    await taskA; 
} 
+0

С помощью 'async-await' используйте только' Task.Run' для запуска задач. В C# методы всегда являются CamelCased, а асинхронные методы должны быть суффиксными ** Async **. Почему вы не используете асинхронные прокси для WCF? –

ответ

0

Не пытаясь дополнительно проанализировать ваш код, это, конечно, проблема:

Task taskA = new Task(() => listanomes.queryAsync(argumentos, 2, 3, query)); 

Вы делаете огонь и забыть здесь. Когда вы начнете свою задачу, она будет немедленно завершена, а queryAsync продолжит выполнение в фоновом режиме.

Вы должны переписать свой код, не используя явно конструктор Task. Я уверен, что это возможно.

+0

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

+0

@ Внешняя задача * сделала *, затем внутренняя задача, которую вы создаете с помощью 'listanomes.queryAsync()' did * not *. Чтобы понять, что я имел в виду, попробуйте следующее: «Задача taskA = new Task (() => listanomes.queryAsync (argumentsos, 2, 3, query) .Wait())', обратите внимание на 'Wait()'. Это для вас, чтобы понять проблему, но использование 'Wait()', как это, также является запахом кода. – Noseratio

+0

Я не совсем понимаю, что вы имеете в виду, но я пробовал этот код, и тот же результат тот же, я не могу ждать функции void. Существует ли какое-либо обходное решение для этой ситуации? – user3285630

0

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

Task taskA = new Task(async() => await listanomes.queryAsync(argumentos, 2, 3, query)); 

Но я действительно не вижу причины, по которой вы создаете отдельную Задачу. Вы можете просто использовать:

await listanomes.queryAsync(argumentos, 2, 3, query); 

Вместо создания taskA, начиная его и ждет его.

+0

Не могу дождаться «void» с использованием обоих решений, спасибо за ваш ответ в любом случае – user3285630

+0

Ну, я предположил, что методы возвращают задачу, потому что в соглашении об именах говорится, что когда имя метода заканчивается Async, это означает, что оно возвращает задачу. –

+0

'new Task (async() => await listanomes.queryAsync (..))' почти так же, как 'new Task (() => listanomes.queryAsync (..))'. Вы правы, хотя OP действительно не нужно создавать внешнюю 'Task' вообще. – Noseratio

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