Я использую неасинхронную c USB-библиотеку от производителя USB-чипа, но хочу, чтобы она была асинхронной c, чтобы использование USB не блокировало пользовательский интерфейс. Я пытаюсь научиться программировать «правильный» путь, и, согласно моим исследованиям, для задач, связанных с вводом-выводом, таких как эта, мы хотим использовать TaskCompletionSource
вместо Task.Run =>
(что больше подходит для задач, связанных с процессором). Учебники по TaskCompletionSource довольно скудны, а те, которые существуют, плохо объясняются для новичков.
После создания оболочек для библиотечных методов с помощью TaskCompletionSource я обнаружил, что пользовательский интерфейс все еще иногда блокируется (хотя он ведет себя намного лучше, чем без). Вот пример моего метода-оболочки:
public static Task<bool> SendMessageAsync(byte[] msg, int sizeOfMsg)
{
uint bytesWritten = 0;
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
// Use of library "Write" method
usbStatus = connectedUSBDevice.Write(msg, sizeOfMsg, ref bytesWritten);
if(usbStatus != FTDI.FT_STATUS.FT_OK)
{
tcs.SetResult(false);
}
else
{
tcs.SetResult(true);
}
return tcs.Task;
}
Затем, чтобы использовать, я просто жду этого:
isOK = await USBLibrary.SendMessageAsync(data, size);
Эта реализация не завершена? Что мне нужно сделать, чтобы убедиться, что это не блокирует пользовательский интерфейс?