2015-12-04 3 views
-2

Я добавил задачу async, которая назначает список новому документу Bson, используя MongoDB.Net driver. Я получаю предупреждение о методе, который говорит, что я должен добавить операторов ожидания к вызовам API.Как рефакторировать метод async для включения операторов ожидания?

Так что я попытался это, добавляя await к вызову API, но он дает мне ошибку:

Error 9 Cannot await 'System.Collections.Generic.List'

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

Список клиентов относится к типу для справки.

Кто-нибудь знает, как я должен добавлять оператор ожидания к вызову API?

Это где я добавил оператор AWAIT по методу:

public async Task LoadDb() 
{ 
    var customerCollection = StartConnection(); 
    try 
    { 
     customers = await customerCollection.Find(new BsonDocument()).ToListAsync().GetAwaiter().GetResult(); 

    } 
    catch (MongoException ex) 
    { 
     //Log exception here: 
     MessageBox.Show("A connection error occurred: " + ex.Message, "Connection Exception", MessageBoxButton.OK, MessageBoxImage.Warning); 
    } 
} 

И это StartConnection(), что customerCollection приходит от:

public IMongoCollection<CustomerModel> StartConnection() 
{ 
    var client = new MongoClient(connectionString); 
    var database = client.GetDatabase("orders"); 
    //Get a handle on the customers collection: 
    var collection = database.GetCollection<CustomerModel>("customers"); 
    return collection; 
} 

ответ

3

Эта строка кода:

customers = await customerCollection.Find(new BsonDocument()).ToListAsync().GetAwaiter().GetResult(); 

должно быть изменено на:

customers = await customerCollection.Find(new BsonDocument()).ToListAsync(); 

Вы можете понять, почему первое неверно из полученного сообщения об ошибке.

Cannot await 'System.Collections.Generic.List'

призывая GetResult блокировать поток, который выполняет код, и вы ждете результата, что вы называли GetResult. GetResult вернет List<MongoDBApp.Models.CustomerModel>. Видимо, вы не можете ждать родового результата. Пока вы можете ждать результата ToListAsync, который является задачей. В вашем случае, набрав ToListAsync, вы получите Task<List<MongoDBApp.Models.CustomerModel>>. Это можно ждать.

+0

Хорошо. Теперь я понимаю, приведенное выше редактирование устраняет ошибку. Но я заметил, что когда я пытаюсь назначить список возвращенных клиентов, в коллекцию Observable типа Customer (используя метод расширения) он не принимает новый тип списка. –

+0

Я получаю следующее сообщение об ошибке: Ошибка 'System.Threading.Tasks.Task >' не содержит определения для 'ToObservableCollection' и никакого метода расширения ' ToObservableCollection 'принимает первый аргумент типа' System.Threading.Tasks.Task > 'можно найти –

+0

Это метод расширения: http://hastebin.com /ohiqafudon.vala –

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