Как написать getawaiter для vb.net

У меня есть программа на vb.net (VS 2017), использующая фреймворк 4.7, где функция занимает слишком много времени для обработки, прерывая перекачку сообщений и вызывая ошибку тайм-аута. Чтобы решить эту проблему, я хочу запустить функцию асинхронно, используя задачи и ожидание. (в новинку для меня). Я понимаю, что для этого мне нужно создать асинхронную функцию (с использованием ключевого слова async), которая использует ожидание для вызова другой асинхронной функции, которая затем выполняет обработку. Проблема в том, как сделать мою собственную функцию асинхронной, которая внутри не использует предопределенный асинхронный процесс, вызываемый await. Для этого мне, кажется, нужно определить GetAwaiter для моей функции, чтобы сделать ее вызываемой с помощью await. Вот где я в тупике. Я искал в Интернете и искал книги по этой теме, и у меня не получилось. Все веб-примеры написаны на C# (с которым я не очень разбираюсь), и я не могу осмыслить примеры кода C#, которые я нашел для создания GetAwaiter. Например, из блога Стивена Туба:

public static TaskAwaiter GetAwaiter(this DateTimeOffset dateTimeOffset) 
{ 
    return (dateTimeOffset – DateTimeOffset.UtcNow).GetAwaiter(); 
}

чтобы создать GetAwaiter для функции DateTimeOffset. Мне не понятна декларативная строка, в частности двойник TaskAwaiter GetAwaiter и содержимое скобок, следующих за ключевым словом GetAwaiter. Я действительно думаю, что «this» относится к отправителю в vb, DateTimeOffset - это имя функции, получающей GetAwaiter, а dateTimeOffset - это передаваемое значение, но я не понимаю эту комбинацию имен функций и значений внутри парена. Как эту строчку можно переписать на vb? Существуют ли какие-либо хорошие, исчерпывающие книги, статьи и т. д., Охватывающие функциональность задачи / ожидания - особенно когда вам нужно создать новую асинхронную функцию, которая не была предварительно упакована и не включена как часть .net и написана с примерами vb. Я нашел очень информативную презентацию Майкла Кеннеди на YouTube, но, как и во всех других найденных мною примерах, она основана на предопределенной асинхронной функции, которую можно вызвать с помощью await. Мне нужно поднять голову над водой - где поверхность?

Фрагмент кода, которым вы поделились, мне кажется подозрительным. Ключевое слово this означает, что функция является методом расширения. Вычитание DateTimeOffsets возвращает TimeSpan, который не имеет встроенного метода GetAwaiter. Кроме того, это не совсем тот метод, который вам может понадобиться для асинхронной обработки.

Eric Andres 23.10.2018 20:17

Кроме того, вы действительно хотите сделать методы асинхронными только в том случае, если есть причина сделать их асинхронными (например, попадание в базу данных, выполнение сетевого вызова, попадание на диск, ожидание таймера). Что касается ввода-вывода, обычно вы будете использовать библиотеку, в которую она уже встроена - большая часть операций ввода-вывода уже асинхронна на уровне ОС.

Eric Andres 23.10.2018 20:21

Для меня это всего лишь основа для создания GetAwaiter, фактическая функциональность для меня несущественна, так как я бы использовал свой собственный код. Меня больше всего интересует, как этот фреймворк может быть написан на VB, поэтому я могу создавать GetAwaiters по мере необходимости для покрытия трудоемких процессов. Спасибо за информацию об этом ключевом слове, я изучу это и кое-что узнаю.

Richard 23.10.2018 20:24

Что ж, я придумал решение - не то, что я хотел, но такое, которое, кажется, преодолевает мое самое большое препятствие, а именно возможность запускать неасинхронную функцию, которая не полагается на ожидание внутри внутри структуры async-await. . Я предусмотрел передачу значений и возврат значения - в данном случае передачу строки и возврат логического значения. В итоге я использовал вызов task.run - см. Следующий комментарий

Richard 24.10.2018 22:41

В основной подпрограмме я сделал ее асинхронной и вызвал асинхронную функцию, используя await Private Async Sub MyProgAsync () dim aBool as boolean = await myFuncAsync (string) Внутри этой функции я использовал task.run: private Async Function myFuncAsync (byval pcValue as string ) как логическое dim lReturn как boolean = await Task (of Boolean) .Run (Function () myTask (pcValue) Return lReturn

Richard 24.10.2018 22:47

Это позволило мне вызвать myTask, передать строковый параметр и вернуть логический ответ, который прошел вверх и вниз по цепочке, а myTask не является Async и не использует ожидание. Тем не менее основная программа запускает цепочку в новый поток, сохраняя при этом поток пользовательского интерфейса активным. Я все еще хочу узнать, как написать GetAwaiter для функции, которую я мог бы написать, чтобы я мог вызывать ее напрямую с помощью await, а не с помощью task.run. Мы будем очень благодарны за любые предложения относительно книг, статей, видео и т. д. (Используя vb, если возможно).

Richard 24.10.2018 22:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
950
0

Другие вопросы по теме