Async await блокирует выполнение даже с помощью Task.WaitAsyncC#

Место общения программистов C#
Ответить
Anonymous
 Async await блокирует выполнение даже с помощью Task.WaitAsync

Сообщение Anonymous »

В моем приложении WPF (.NET 8.0) я хочу использовать асинхронную операцию из сторонней библиотеки. При тестировании всего кода внутри MainWindow.xaml.cs все работает гладко. Когда я перемещаю тот же код в отдельный класс с помощью статического конструктора, операция блокируется на неопределенный срок даже при использовании WaitAsync.
Вот мой код:

Код: Выделить всё

  public class VirtuosoCommunication
{
..
public static VirtuosoCommunication? Create(...)
{
VirtuosoCommunication vc = new VirtuosoCommunication();
// setting private variables for vc

if (!vc.TestRead(log)) return null;
if (!vc.TestWrite(log)) return null;

return vc;
}

private bool TestRead(Log? log)
{
string testGraph = "...";
Task task = LoadGraphFromSparqlRemoteEndpoint(testGraph, log);

Graph? g = task.Result;
return g != null;
}

internal async Task LoadGraphFromSparqlRemoteEndpoint(string graphFullName, Log? log)
{
Uri baseUri = new Uri(_readEndpoint ?? "");

HttpClient client = new HttpClient();
client.BaseAddress = baseUri;

SparqlQueryClient sparqlQueryClient = new SparqlQueryClient(client, baseUri);

Graph result = new Graph();
IGraph? tmp = null;

try
{
while (tmp == null || tmp.Triples.Count == limit)
{
string query = "construct { ?s ?p ?o } FROM  where {?s ?p ?o.} OFFSET " + offSet.ToString() + " LIMIT " + limit.ToString();
Task task = sparqlQueryClient.QueryWithResultGraphAsync(query);
tmp = await task.WaitAsync(TimeSpan.FromSeconds(4));

...
}
}
catch (Exception ex) { ... }

return result;
}
Когда я запускаю код построчно, он прекращает выполнение в tmp = await Task.WaitAsync. Когда я затем нажимаю кнопку «Прервать выполнение» в Visual Studio, он показывает мне линейный график? g = Task.Result в методе TestRead, который будет выполняться следующим при возвращении потока.
Как я уже сказал, тот же асинхронный вызов в тестовой процедуре полностью размещен в MainWindow.xaml.cs работает без проблем, поэтому я думаю, что я как-то неправильно использую асинхронный вызов.
ОБНОВЛЕНИЕ 25.11.2024
Из ответ на этот вопрос я изменил метод TestRead на:

Код: Выделить всё

private bool TestRead(Log? log)
{
string testGraph = "...";
//Task task = LoadGraphFromSparqlRemoteEndpoint(testGraph, log);
Task task = Task.Run(async() => await LoadGraphFromSparqlRemoteEndpoint(testGraph, log));

Graph? g = task.Result;
return g != null;
}
Это работает вот так (да!), но я не уверен, что это правильный способ. Что касается распараллеливания, мне просто нужен вызов конечной точки SPARQL, чтобы не блокировать мой пользовательский интерфейс, мне при этом не нужно запускать другие параллельные задачи.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -waitasync
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»