Я пытаюсь получить два типа данных с двух разных сайтов и привязать их к списку, но у меня возникла проблема с Async, то, что я хочу сделать, это получить информацию от rss добавить его в список, затем получить информацию с другого веб-сайта, добавить его в список, а затем добавить два в связанную наблюдаемую коллекцию. Но DownloadStringAsync перегоняют друг друга, и приложение выходит из строя. Не могли бы вы мне помочь?Как сделать асинхронную задачу synchronus
моего код
private static ObservableCollection<Top> top= new ObservableCollection<Top>();
private static ObservableCollection<string> place= new ObservableCollection<string>();
// Constructor
public MainPage()
{
InitializeComponent();
if (NetworkInterface.GetIsNetworkAvailable())
{
LoadSiteContent_A(url1);
LoadSiteContent_B(url2);
}
else
MessageBox.Show("No Internet Connection, please connect to use this applacation");
listBox.ItemsSource = top; //trying to bind listbox after web calls
}
public void LoadSiteContent_A(string url)
{
//create a new WebClient object
WebClient clientC = new WebClient();
clientC.DownloadStringCompleted += new DownloadStringCompletedEventHandler(a_DownloadStringCompleted);
clientC.DownloadStringAsync(new Uri(url));
}
public void LoadSiteContent_B(string url)
{
//create a new WebClient object
WebClient clientC = new WebClient();
clientC.DownloadStringCompleted += new DownloadStringCompletedEventHandler(b_DownloadStringCompleted);
clientC.DownloadStringAsync(new Uri(url));
}
public void a_DownloadStringCompleted(Object sender, DownloadStringCompletedEventArgs e)
{
string testString = "";
if (!e.Cancelled && e.Error == null)
{
string str;
str = (string)e.Result;
//Various operations and parsing
place.Add(testString);
}
}
}
public void b_DownloadStringCompleted(Object sender, DownloadStringCompletedEventArgs e)
{
string testMatch = "";
if (!e.Cancelled && e.Error == null)
{
string str;
// Size the control to fill the form with a margin
str = (string)e.Result;
//Various operations and parsing
top.Add(new Top(testMatch,(place.Count+1)));
}
}
public class TopUsers
{
public string TopUsername { get; set; }
public int Place { get; set; }
public TopUsers(string topusername, int place)
{
this.TopUsername = topusername;
this.Place = place;
}
}
}
Если вы хотите, чтобы быть синхронными, то почему бы просто не назвать LoadSiteContent_B в a_DownloadStringCompleted()? Это будет имитировать синхронную активность, но с преимуществами асинхронности. – Archer
Ты отлично справляешься с реализацией асинхронной работы. Вам просто нужно найти способ синхронного добавления к наблюдаемой коллекции. Подсказка: найдите ключевое слово «lock» – Polity
Поцарапайте мой намек, вы используете статический экземпляр и, следовательно, должны переосмыслить свой дизайн. Добавление к вашей наблюдаемой коллекции должно выполняться в основном потоке. new Hint: синхронизация поиска. – Polity