У меня есть библиотека, которая содержит как синхронные, так и асинхронные реализации функции, которая соединяется с некоторым оборудованием и считывает некоторые данные. Вот код, я использую:Свойство IAsyncResult AsyncState всегда равно null
public class Reader
{
private HardwareService service = new HardwareService();
private string[] id = new string[128];
public string[] ReadData()
{
// Synchronous implementation that works, but blocks the main thread.
return service.ReadID();
}
public void ReadDataAsync()
{
// Asynchronous call, that does not block the main thread, but the data returned in the callback are always null.
AsyncCallback callback = new AsyncCallback(ProcessData);
service.BeginReadID(callback, id);
}
static void ProcessData(IAsyncResult result)
{
string[] id_read = (string[])result.AsyncState; // Always NULL
}
}
Почему, когда я использую неблокированный асинхронный вызов, я всегда получаю массив, заполненный NULL объектов? Это первый раз, когда я использую этот подход, поэтому я немного потерялся здесь. Спасибо за любой совет.
Великий, который работает, спасибо! Я просто не знаю, почему мне нужно передать экземпляр объекта функции BeginReadID, когда я читаю новый экземпляр объекта с результатом, вызывая EndReadID. –
@ Tomáš'GunsBlazing'Frček Пользовательское состояние очень полезно передать объекты методам обратного вызова. Методы обратного вызова могут выполняться в любом потоке и могут быть статическими и т. Д., Поэтому отключенный от контекста запуск операции. Вам не нужно ничего вводить в состояние, потому что 1. вам не нужно ничего, кроме экземпляра службы, и 2. ваша функция обратного вызова является членом экземпляра вашего класса и может обращаться к другим ее членам (например: экземпляр службы) –
@ Tomáš'GunsBlazing'Frček Просто передайте null в этих случаях. –