Синхронный обработчик для OpenReadCompletedEventArgs - PullRequest
0 голосов
/ 08 августа 2011

Мой текущий проект использует асинхронные методы для загрузки файлов через WebService (из-за ограничений SL).Я пытаюсь написать переопределяющий класс, который использует тот же интерфейс, но фактически читает файлы синхронно из XAP.Я проверил, что могу получить доступ к файловым потокам в XAP, как и ожидалось.

Однако я не знаю, как запустить мой обработчик и прочитать файл синхронно.Похоже, OpenReadCompletedEventArgs.Result - это свойство, для которого я должен установить свой поток.Однако я не могу установить это свойство, так как оно доступно только для чтения.

Как мне создать объект такого типа с помощью набора потоков?Или есть что-то еще, что я должен сделать, чтобы достичь того, что я хочу, не меняя интерфейсы.

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Не могу понять этого, но я думаю , что у вас есть какой-то существующий код, который потребляет OpenReadCompletedEventArgs, и вы хотите повторно использовать этот код, когда полученный поток действительно из Xapне загруженный ресурс.

Вы не сможете наследовать или мутировать класс OpenReadCompletedEventArgs, поскольку все его конструкторы являются частными.

Следовательно, вам нужно будет изменить существующий код.Вероятно, вас действительно интересует только Stream, поэтому в действительности вам нужно только переместить большую часть кода в функции, которые принимают объект Stream.Теперь код, использующий событие OpenReadCompleted, будет вызывать эти функции, передавая e.Result, и новый код может просто извлечь поток из Xap и передать его этим же функциям.

0 голосов
/ 10 августа 2011

Я написал отдельный делегат обработчика события и аргументы обработчика для обработки этой ситуации. Аргументы моего обработчика событий могут быть созданы из объекта OpenReadCompletedEventArgs. Я позаботился о том, чтобы использовались одни и те же имена свойств, чтобы не пришлось менять вызывающий код.

Кроме того, в моей функции обработчика событий для асинхронного кода я просто добавил анонимный обработчик событий, который вызвал мой пользовательский класс обработчика событий:

public void FunctionUsingHandler(MyCustomHandler handler)
{
    WebClient c;
    ...
    c.OpenReadCompleted += new OpenReadCompletedEventHandler((sender, e) => handler(sender, new MyCustomHandlerArgs(e)));
    ...
}

Таким образом, мой обработчик запускается только после завершения операции чтения. Синхронные пользователи могут сразу же вызвать мой обработчик с соответствующими аргументами.

...