[prg] Re[2]: Организация другого потока: подвисает форма
Прошу прощения, написал фигню. Запрос в сеть происходит, видимо, в
другом методе, а именно
XmlReader reader = XmlReader.Create(treeView1.SelectedNode.Tag.ToString());
а уже потом результаты запроса передаются
SyndicationFeed feed = SyndicationFeed.Load(reader);
и повисает форма на выполнении
XmlReader reader = XmlReader.Create(treeView1.SelectedNode.Tag.ToString());
19.09.2018 11:43, konstantin galiakhmetov пишет:
Здравствуйте, Кирилл.
Насколько я могу судить, SyndicationFeed.Load довольно древнее api и
асинхронной реализации не имеет, таким образом чтобы не подвисала форма,
действительно придется создавать фоновый поток.
Примерно в .net 4.0 были введены так называемые таски, которые
предоставляют более высокоуровневый api для работы с потоками, чем
thread,, таким образом ваш пример должен выглядеть как-то так:
public Task<SyndicationFeed> GetFeedAsync(string url)
{
var taskCompletionSource = new
TaskCompletionSource<SyndicationFeed>();
Task.Run(() =>
{
try
{
using (var reader = XmlReader.Create(url))
{
var syndicationFeed = SyndicationFeed.Load(reader);
taskCompletionSource.SetResult(syndicationFeed);
}
}
catch (Exception ex)
{
taskCompletionSource.SetException(ex);
}
});
return taskCompletionSource.Task;
}
// и вызов этого метода в обработчике клика на кнопку
private async void button1_Click(object sender, EventArgs e)
{
var feed = await
GetFeedAsync(treeView1.SelectedNode.Tag.ToString());
// Какие-то действия производимые после загрузки
}
Надеюсь, что пример достаточно корректен, но я бы предпочел
воспользоваться новой реализацией этой библиотеки:
https://www.nuget.org/packages/Microsoft.SyndicationFeed.ReaderWriter/
устанавливается с помощью package manager console, командой
Install-Package Microsoft.SyndicationFeed.ReaderWriter
В их репозитории на github:
https://github.com/dotnet/SyndicationFeedReaderWriter
есть несколько примеров, с помощью которых можно ознакомиться с
библиотекой, и эти примеры изначально иллюстрируют каким образом
работать с ней асинхронно.