Глава.25 .Взаимодействие.с.компонентами.WinRT
самого сложного метода
AsTask
. Конечно, более простые перегруженные версии
устроены проще.
public
static Task AsTask(
this IAsyncOperationWithProgress asyncOp,
CancellationToken ct = default(CancellationToken),
IProgress progress = null) {
// При отмене CancellationTokenSource отменить асинхронную операцию
ct.Register(() => asyncOp.Cancel());
// Когда асинхронная операция оповещает о прогрессе,
// оповещение передается методу обратного вызова
asyncOp.Progress = (asyncInfo, p) => progress.Report(p);
// Объект TaskCompletionSource наблюдает за завершением
// асинхронной операции
var tcs = new TaskCompletionSource();
// При завершении асинхронной операции оповестить TaskCompletionSource.
// Когда это происходит, управление возвращается коду,
// ожидающему завершения TaskCompletionSource.
asyncOp.Completed = (asyncOp2, asyncStatus) => {
switch (asyncStatus) {
case AsyncStatus.Completed: tcs.SetResult(asyncOp2.GetResults()); break;
case AsyncStatus.Canceled: tcs.SetCanceled(); break;
case AsyncStatus.Error: tcs.SetException(asyncOp2.ErrorCode); break;
}
};
return tcs.Task;
}
Взаимодействия между потоками WinRT и потоками .NET
Многие классы .NET Framework работают с типами, производными от
System.
IO.Stream
— как, например, классы сериализации и LINQ. Чтобы использовать объ-
ект WinRT, реализующий интерфейсы WinRT
IStorageFile
или
IStorageFolder
,
с классом .NET Framework, которому необходим тип, производный от Stream,
следует задействовать методы расширения, определенные в классе
System.IO.Wi
ndowsRuntimeStorageExtensions
.
namespace System.IO { // Определяется в System.Runtime.WindowsRuntime.dll
public static class WindowsRuntimeStorageExtensions {
public static Task OpenStreamForReadAsync(this IStorageFile file);
public static Task OpenStreamForWriteAsync(this IStorageFile file);
public static Task OpenStreamForReadAsync(this
IStorageFolder rootDirectory,
String relativePath);
public static Task OpenStreamForWriteAsync(this
711
Проекции.уровня. NET.Framework
IStorageFolder rootDirectory,
String relativePath, CreationCollisionOption creationCollisionOption);
}
}
В следующем примере один из методов расширения используется для открытия
объекта WinRT
StorageFile
и чтения его содержимого в объект .NET Framework
XElement
.
async Task FromStorageFileToXElement(StorageFile file) {
using (Stream stream = await file.OpenStreamForReadAsync()) {
return XElement.Load(stream);
}
}
Наконец, класс
System.IO.WindowsRuntimeStreamExtensions
предоставляет
методы расширения, «преобразующие» потоковые интерфейсы WinRT (такие, как
IRandomAccessStream
,
IInputStream
или
IOutputStream
) в тип .NET Framework
Stream
, и наоборот.
namespace
System.IO { // Определяется в System.Runtime.WindowsRuntime.dll
public static class WindowsRuntimeStreamExtensions {
public static Stream AsStream(this IRandomAccessStream winRTStream);
public static Stream AsStream(this IRandomAccessStream winRTStream,
Int32 bufferSize);
public static Stream AsStreamForRead(this IInputStream winRTStream);
public static Stream AsStreamForRead(this IInputStream winRTStream,
Int32 bufferSize);
public static Stream AsStreamForWrite(this IOutputStream winRTStream);
public static Stream AsStreamForWrite(this IOutputStream winRTStream,
Int32 bufferSize);
public static IInputStream AsInputStream (this Stream clrStream);
public static IOutputStream AsOutputStream(this Stream clrStream);
}
}
В следующем примере один из методов расширения используется для «преоб-
разования» объекта WinRT
IInputStream
в объект .NET Framework
Stream
.
XElement FromWinRTStreamToXElement(IInputStream winRTStream) {
Stream netStream = winRTStream.AsStreamForRead();
return XElement.Load(netStream);
}
Обратите внимание: методы «преобразования», предоставляемые .NET
Framework, не ограничиваются простым внутренним преобразованием типа. Ме-
тоды, адаптирующие потоки WinRT в потоки .NET Framework, неявно создают
буфер для потока WinRT в управляемой куче. В результате большинство операций
осуществляет запись в буфер и не нуждается в пересечении границы взаимодей-
ствия, что способствует повышению производительности — это особенно важно
в ситуациях с многочисленными мелкими операциями ввода-вывода (например,
при разборе документа XML).
712
Do'stlaringiz bilan baham: |