【问题标题】:IRandomAccessStream does not support the CloneStream method because it requires cloning and this stream does not support cloningIRandomAccessStream 不支持 CloneStream 方法,因为它需要克隆并且此流不支持克隆
【发布时间】:2018-01-08 22:19:58
【问题描述】:

您好,我正在构建一个 UWP 应用程序(针对 10240 和 Microsoft.NETCore.UniversalWindowsPlatform 6.0.5),以下简单代码引发异常:

        var ms = new MemoryStream(new byte[16]);
        var randomAccessStream = RandomAccessStreamReference.CreateFromStream(ms.AsRandomAccessStream());                
        var newStream = await randomAccessStream.OpenReadAsync();

这段代码抛出异常:

  Message=This IRandomAccessStream does not support the CloneStream method 
  because it requires cloning and this stream does not support cloning.

Source=System.Runtime.WindowsRuntime
  StackTrace:
   at System.IO.NetFxToWinRtStreamAdapter.ThrowCloningNotSuported(String methodName)
   at System.IO.NetFxToWinRtStreamAdapter.CloneStream()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()

【问题讨论】:

    标签: c# uwp stream


    【解决方案1】:

    看到这个How to: Convert Between .NET Framework Streams and Windows Runtime Streams

    ".NET Framework 流不支持克隆,即使在转换之后也是如此。这意味着如果您将 .NET Framework 流转换为 Windows 运行时流并调用 GetInputStreamAt 或 GetOutputStreamAt(它们调用 CloneStream 或直接调用 CloneStream),则会出现异常发生。”

    您下面的代码实际上创建了一个 .NET Framework 流。并且代码 OpenReadAsync 可能会在其中调用 CloneStream 导致异常发生:

    var ms = new MemoryStream(new byte[16]);
    

    要解决此类问题,我们需要了解更多详细信息,以便我们可以帮助您修改代码。一般来说,你需要切换到windows运行时流来避免这个异常。

    【讨论】:

    • 如果您创建一个针对 Windows 版本 10240 的 UWP 应用,并将这些代码行放在一个空项目的 MainPage 中,您将能够重现该错误。什么相当于 Windows 运行时流?
    • 在这里他们使用的是内存流,我不知道 3 行代码可能出了什么问题。 docs.microsoft.com/en-us/dotnet/standard/io/…
    【解决方案2】:

    有人已经回答了类似的问题: Is there a way to convert a System.IO.Stream to a Windows.Storage.Streams.IRandomAccessStream?

    这段代码解决了问题:

      private static async Task<IRandomAccessStreamReference> ConvertToRandomAccessStream(MemoryStream memoryStream)
        {
            var randomAccessStream = new InMemoryRandomAccessStream();
            var outputStream = randomAccessStream.GetOutputStreamAt(0);
            await RandomAccessStream.CopyAndCloseAsync(memoryStream.AsInputStream(), outputStream);
            var result = RandomAccessStreamReference.CreateFromStream(randomAccessStream);
            return result;
        }
    

    【讨论】:

    • 在 Xamarin PCL 中,这解决了将 Azure Cognitive TTS 转换为 MediaPlayer 播放器可以使用的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2014-03-05
    • 2011-07-30
    • 2021-06-26
    相关资源
    最近更新 更多