Как в синхронном методе дождаться асинхронный?
Цитата: Вова Петров от 02.09.2022, 05:02Здравствуйте, помогите пожалуйста, нужно написать синхронный метод в котором будет вызываться асинхронный, проблема в том, что Task.Result взаимоблокирует UI, а синхронного метода GetManifestAsync нет
namespace M3U_Editor { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Button1_Click(object sender, EventArgs e) { detail("https://www.youtube.com/watch?v=123"); } public StreamManifest detail(string url) { YoutubeClient youtube2 = new YoutubeClient(); try { string urltest = Regex.Match(url, "https://www.youtube.com/watch\\?v=(.*)").Groups[1].Value; if ((urltest == null) || (urltest == "") || (url.Contains('&'))) { return null; } return youtube2.Videos.Streams.GetManifestAsync(url).Result; } catch { return null; } } } }
Здравствуйте, помогите пожалуйста, нужно написать синхронный метод в котором будет вызываться асинхронный, проблема в том, что Task.Result взаимоблокирует UI, а синхронного метода GetManifestAsync нет
namespace M3U_Editor
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
detail("https://www.youtube.com/watch?v=123");
}
public StreamManifest detail(string url)
{
YoutubeClient youtube2 = new YoutubeClient();
try
{
string urltest = Regex.Match(url, "https://www.youtube.com/watch\\?v=(.*)").Groups[1].Value;
if ((urltest == null) || (urltest == "") || (url.Contains('&'))) { return null; }
return youtube2.Videos.Streams.GetManifestAsync(url).Result;
}
catch { return null; }
}
}
}
Цитата: No_Hammer от 02.09.2022, 13:59Привет, могу предложить такой вариант:
private async void Button1_Click(object sender, EventArgs e) { StreamManifest sm = await Detail("https://www.youtube.com/watch?v=123"); label1.Text = sm.GetVideoStreams().ToArray()[0].Url; } public async Task<StreamManifest> Detail(string url) { YoutubeClient youtube2 = new YoutubeClient(); try { string urltest = Regex.Match(url, "https://www.youtube.com/watch\\?v=(.*)").Groups[1].Value; if ((urltest == null) || (urltest == "") || (url.Contains('&'))) { return null; } return await youtube2.Videos.Streams.GetManifestAsync(url); } catch { return null; } }
Привет, могу предложить такой вариант:
private async void Button1_Click(object sender, EventArgs e)
{
StreamManifest sm = await Detail("https://www.youtube.com/watch?v=123");
label1.Text = sm.GetVideoStreams().ToArray()[0].Url;
}
public async Task<StreamManifest> Detail(string url)
{
YoutubeClient youtube2 = new YoutubeClient();
try
{
string urltest = Regex.Match(url, "https://www.youtube.com/watch\\?v=(.*)").Groups[1].Value;
if ((urltest == null) || (urltest == "") || (url.Contains('&'))) { return null; }
return await youtube2.Videos.Streams.GetManifestAsync(url);
}
catch { return null; }
}
Цитата: Вова Петров от 02.09.2022, 14:30Пока что получилось так, может есть какие-то другие варианты?
public StreamManifest detail(string url) { YoutubeClient youtube2 = new YoutubeClient(); try { string urltest = Regex.Match(url, "https://www.youtube.com/watch\\?v=(.*)").Groups[1].Value; if ((urltest == null) || (urltest == "") || (url.Contains('&'))) { return null; } StreamManifest manifest = null; Task.Run(()=> { manifest = youtube2.Videos.Streams.GetManifestAsync(url).Result; }).Wait(); return manifest; } catch { return null; } }
Пока что получилось так, может есть какие-то другие варианты?
public StreamManifest detail(string url)
{
YoutubeClient youtube2 = new YoutubeClient();
try
{
string urltest = Regex.Match(url, "https://www.youtube.com/watch\\?v=(.*)").Groups[1].Value;
if ((urltest == null) || (urltest == "") || (url.Contains('&'))) { return null; }
StreamManifest manifest = null;
Task.Run(()=> { manifest = youtube2.Videos.Streams.GetManifestAsync(url).Result; }).Wait();
return manifest;
}
catch { return null; }
}
Цитата: Вова Петров от 02.09.2022, 14:36@no_hammer Привет, спасибо за помощь, но тут я вызываю временно с кнопки, и хотел сделать полностью синхронный метод, с ожиданием асинхронного внутри, вызываться будет также с синхронного метода
@no_hammer Привет, спасибо за помощь, но тут я вызываю временно с кнопки, и хотел сделать полностью синхронный метод, с ожиданием асинхронного внутри, вызываться будет также с синхронного метода