Чтение Стивена Клири, беру , не блокируя асинхронный код Я пишу что-то вроде этого
public static async Task<JObject> GetJsonAsync(Uri uri)
{
using (var client = new HttpClient())
{
var jsonString = await client.GetStringAsync(uri).ConfigureAwait(false);
return JObject.Parse(jsonString);
}
}
public async void Button1_Click(...)
{
var json = await GetJsonAsync(...);
textBox1.Text=json;
}
пока все хорошо, я понимаю, что после ConfigureAwait
метод продолжит работу в другом контексте после возврата GetStringAsync
.
но что делать, если я хочу использовать что-то вроде MessageBox
(который является пользовательским интерфейсом), как это
public static async Task<JObject> GetJsonAsync(Uri uri)
{
if(someValue<MAXVALUE)
{
using (var client = new HttpClient())
{
//var jsonString = await client.GetStringAsync(uri); //starts the REST request
var jsonString = await client.GetStringAsync(uri).ConfigureAwait(false);
return JObject.Parse(jsonString);
}
}
else
{
MessageBox.Show("The parameter someValue is too big!");
}
}
я могу это сделать?
Еще сложнее, как насчет этого?
public static async Task<JObject> GetJsonAsync(Uri uri)
{
if(someValue<MAXVALUE)
{
try{
using (var client = new HttpClient())
{
//var jsonString = await client.GetStringAsync(uri); //starts the REST request
var jsonString = await client.GetStringAsync(uri).ConfigureAwait(false);
return JObject.Parse(jsonString);
}
}
catch(Exception ex)
{
MessageBox.Show("An Exception was raised!");
}
}
else
{
MessageBox.Show("The parameter someValue is too big!");
}
}
Могу ли я сделать это?
Теперь я думаю, что, возможно, все окна сообщений должны быть вызваны вне GetJsonAync как хороший дизайн, но мой вопрос в том, можно ли что-то сделать выше?