2015-11-30 3 views
0

У меня есть библиотека, которая содержит как синхронные, так и асинхронные реализации функции, которая соединяется с некоторым оборудованием и считывает некоторые данные. Вот код, я использую:Свойство 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 объектов? Это первый раз, когда я использую этот подход, поэтому я немного потерялся здесь. Спасибо за любой совет.

ответ

1

С асинхронными реализациями пользовательское состояние извлекается, как оно установлено во время запуска асинхронной операции. Поскольку вы передаете строку [] со всеми нулевыми значениями, вы возвращаете ее обратно.

Вы не вызываете службу EndReadID() для получения результатов.

Попробуйте следующее: (я предполагаю, что служба реализует EndReadID метод, и он должен, если он следует стандартной практики)

static void ProcessData(IAsyncResult result) 
{ 
    string[] id_read = service.EndReadID(result); 
} 
+0

Великий, который работает, спасибо! Я просто не знаю, почему мне нужно передать экземпляр объекта функции BeginReadID, когда я читаю новый экземпляр объекта с результатом, вызывая EndReadID. –

+0

@ Tomáš'GunsBlazing'Frček Пользовательское состояние очень полезно передать объекты методам обратного вызова. Методы обратного вызова могут выполняться в любом потоке и могут быть статическими и т. Д., Поэтому отключенный от контекста запуск операции. Вам не нужно ничего вводить в состояние, потому что 1. вам не нужно ничего, кроме экземпляра службы, и 2. ваша функция обратного вызова является членом экземпляра вашего класса и может обращаться к другим ее членам (например: экземпляр службы) –

+0

@ Tomáš'GunsBlazing'Frček Просто передайте null в этих случаях. –

Смежные вопросы