Отправляет email-рассылки с помощью сервиса Sendsay

[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 пишет:

Ответить   Wed, 19 Sep 2018 21:42:01 +0300 (#3583334)

 

Ответы:

Здравствуйте, Кирилл.

Насколько я могу судить, 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
есть несколько примеров, с помощью которых можно ознакомиться с
библиотекой, и эти примеры изначально иллюстрируют каким образом
работать с ней асинхронно.

Ответить   Fri, 21 Sep 2018 13:27:52 +0300 (#3583544)