首页 > 解决方案 > .Net 核心不支持 AsyncResult

问题描述

我正在将 MVC 应用程序迁移到 .NET Core 中,我必须对解决方法AsyncResult类进行代码更改

错误:找不到类型或命名空间名称“AsyncResult”(您是否缺少 using 指令或程序集引用?)

delegate void CopyMemoryStreamToFileDelegate(MemoryStream memorystream, string path);

public static bool SaveXmlIndentedAsync(XmlDocument doc, string path)
{
    XmlTextWriter writer = null;
    MemoryStream memorystream = new MemoryStream();

    CopyMemoryStreamToFileDelegate copyDelegate;


    Xmlattributes attribute = doc.CreateAtteibute("datetime");
    attribute.Value = DateTime.Now.ToString();
    doc.DocumentElement.Attributes.Append(attribute);
    writer = new XmlTextWriter(memorystream, Encoding.UTF8);
    writer.IndentChar = '\t';
    writer.Formating = Formatting.Indented;
    doc.Save(writer);

    // Instantiated the call & callback delegates
    copydelegate = new CopyMemoryStreamToFileDelegate(CopyMemoryStreamToFile);

    //From here I'm calling below CopyCallback function 
    AsyncCallback callback = new AsyncCallback(CopyCallback);

}

private static void CopyCallback(IAsyncResult ar)
{
    CopyMemoryStreamToFileDelegate copydelegate;
    try
    {
        //Get the asyncresult
        AsyncResult aResult = (AsyncResult)ar;// here I'm getting error Asyncresult 
                                                //Get the delegate that has fired the beginInvoke
        copyDelegate = aResult.AsyncDelegate as
        CopyMemoryStreamToFileDelegate;
        if (copyDelegate == null) return;

        //End Envoke
        copyDelegate.EndInvoke(ar);
    }
    catch(Exception ex)
    {
        Log.error(null, "copycallback: CopyMemoryStreamToFile throw ana exception", ex);
    }
}

private static void CopyMemoryStreamToFile(MemoryStream memorystream, string path)
{
FileStream filestream =null;
filestream = new FileStream(path,FileMode.Create);
byte[] buffer = memorystream.ToArray();
filestream.write(buffer,0,buffer.Length);
}

经过基础研究,我发现 .net 核心中不存在 asyncResult。我正在尝试实现 Using Task Run 和 async/await 但不自信。能否请您提供代码更改解决方案,谢谢。

标签: c#asp.net-coreasynchronousasync-await

解决方案


如果我正确理解您的问题,那么您想以MemoryStream异步方式将数据从 a 复制到文件中。

public static async Task SaveXmlIndentedAsync(XmlDocument doc, string path)
{
    XmlTextWriter writer = null;
    MemoryStream memorystream = new MemoryStream();

    Xmlattributes attribute = doc.CreateAtteibute("datetime");
    attribute.Value = DateTime.Now.ToString();
    doc.DocumentElement.Attributes.Append(attribute);
    writer = new XmlTextWriter(memorystream, Encoding.UTF8);
    writer.IndentChar = '\t';
    writer.Formating = Formatting.Indented;
    doc.Save(writer);

    using var filestream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true);
    memorystream.Position = 0;
    await memorystream.CopyToAsync(fileStream);
}
  1. 打开 FileStream 进行异步写入
  2. 将 memoryStream 的位置设置为开头
  3. 将 memoryStream 复制到文件流中

我已将签名从更改static boolstatic async Task能够使用await


我还没有测试过代码,所以FlushAsync可能需要在CopyToAsync.


推荐阅读