/ / Використовуйте асинхронний метод замість синхронізуючого - c #, асинхронний

Використовуйте метод async замість синхронізації one - c #, асинхронний

Наскільки я намагався з'ясувати, щоб виявити a sync метод до async:

private async void RefreshScreen()
{
await System.Threading.Tasks.Task.Run(() =>
{
this.refreshContent();
this.refreshTokens();
}
);
}

Хіба в будь-якому разі не можна отримати це більш елегантним способом?

РЕДАГУВАТИ

Як ви можете зрозуміти RefreshContent() і RefreshTokens() беруть участь у кількох дзвінках до веб-служби.

Ця реалізація клієнтської веб-послуги забезпечує sync і async способи виклику методу:

public async System.Threading.Tasks.Task<string> GetUrlAsync ()
{
ApiResponse<string> localVarResponse = await GetUrlAsyncWithHttpInfo();
return localVarResponse.Data;
}

public string GetUrl ()
{
ApiResponse<string> localVarResponse = GetUrlWithHttpInfo();
return localVarResponse.Data;
}

В даний час ми використовуємо "sync" методи, і, звичайно, ми хочемо продовжувати використовувати async дзвінки

Приклад:

public Enumerable<Element> GatherElements()
{
return yield new Element() {
Field1 = RESTClient.GetMethod1(),
Field2 = RESTClient.GetMethod2(),
Field3 = RESTClient.GetMethod3(),
Field4 = RESTClient.GetMethod4(),
Field5 = RESTClient.GetMethod5(),
Field6 = RESTClient.GetMethod6(),
Field7 = RESTClient.GetMethod7()
};
}

Я не хочу чекати, поки завершаться всі дзвінки для відпочинку, я хочу повернути всі Елементи, незалежно від того, чи кожен Field заповнений.

Я не знаю, чи я так добре пояснив.

Відповіді:

3 для відповіді № 1

Ви "підходите до проблеми" назад ". Замість того, щоб намагатися зрозуміти, як" зробити цей метод асинхронним ", вам слід почати з іншого кінця.

Наприклад, що робить refreshContent робити? Чи виконує він введення-виведення повільно, можливо, потрапляючи в веб-API або базу даних? Тоді ви починаєте з тих низькорівневих дзвінків в Інтернет / базу даних. Зробіть ці асинхронні перший (обидва HttpClient та Entity Framework мають вбудовану асинхронну підтримку). Потім await ці дзвінки, і нехай async рости звідти.

Якщо ви застосуєте такий підхід, вам допоможе компілятор, наприклад, він порекомендує вам змінити типи повернення на Task/Task<T> коли ви додаєте async. Як зазначали інші, ви повинні уникати async void. Вам також не потрібно буде користуватися Task.Run окрім випадків, коли ви виконуєте важкі операційні процеси, які вам потрібно розвантажити.

Зрештою, у вас все вийде async Task RefreshScreen, на який ви можете зателефонувати з async void обробник подій.