Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步写入二进制文件?_C#_.net_Async Await_Streamwriter_Binary Data - Fatal编程技术网

C# 异步写入二进制文件?

C# 异步写入二进制文件?,c#,.net,async-await,streamwriter,binary-data,C#,.net,Async Await,Streamwriter,Binary Data,我正在尝试使一个旧方法异步。 它从数据库中获取BLOB并将其作为文件写入磁盘 但是,BinaryWriter的写入方法没有异步版本。 我可以改用StreamWriter吗?因为它有WriteAsync方法。 有什么区别?有什么缺点吗 部分代码: OracleParameter returnParam=新的OracleParameterblob,OracleDbType.Blob; command.Parameters.AddreturnParam; wait command.ExecuteNon

我正在尝试使一个旧方法异步。 它从数据库中获取BLOB并将其作为文件写入磁盘

但是,BinaryWriter的写入方法没有异步版本。 我可以改用StreamWriter吗?因为它有WriteAsync方法。 有什么区别?有什么缺点吗

部分代码:

OracleParameter returnParam=新的OracleParameterblob,OracleDbType.Blob; command.Parameters.AddreturnParam; wait command.ExecuteNonQueryAsync; OracleBlob blob=返回参数值作为OracleBlob; 字节[]数据=新字节[blob.Length]; wait blob.ReadAsyncdata,0,Convert.ToInt32blob.Length; fileFullPath=Path.Combinefolder,文件名; 使用FileStream fs=newfilestreamfilefullpath、FileMode.OpenOrCreate、FileAccess.Write { 使用BinaryWriter bw=新的BinaryWriterfs { Writedata;//这里没有异步方法 logger.debugger已完成将文件{0}写入磁盘,fileFullPath; } } 我能把它改成下面的吗

OracleParameter returnParam=新的OracleParameterblob,OracleDbType.Blob; command.Parameters.AddreturnParam; wait command.ExecuteNonQueryAsync; OracleBlob blob=返回参数值作为OracleBlob; 字节[]数据=新字节[blob.Length]; wait blob.ReadAsyncdata,0,Convert.ToInt32blob.Length; fileFullPath=Path.Combinefolder,文件名; 使用FileStream fs=newfilestreamfilefullpath、FileMode.OpenOrCreate、FileAccess.Write { 使用var writer=newstreamwriters { wait writer.WriteAsyncnew Unicodeincode.GetCharsdata;//必须将字节数组转换为字符数组 logger.debugger已完成将文件{0}写入磁盘,fileFullPath; } } 它从数据库中获取BLOB并将其作为文件写入磁盘

通常,这是不必要的。如果您正在编写一个服务器,您可以通过一个或其他类似的方式来分发它

如果这更像是一个下载操作,那么您需要最少的多任务处理:

向它扔很多任务是没有用的。此操作听起来像是网络数据库或磁盘绑定。您所能做的就是将整个读/写过程移动到单个备用任务中。这样执行就不会占用GUI。这是最少的多任务处理量,即使是在现在编写文字处理器时,也必须这样做

这里还有一些有用的信息:

您可以将整个代码移动到一个异步函数中。
确保函数返回一个任务,即使它是当前任务。然后调用它,然后等待它。

这里不需要BinaryWriter。只需将字节[]发送到流

using (FileStream fs = new FileStream(fileFullPath, FileMode.OpenOrCreate, FileAccess.Write))
{
   await fs.WriteAsync(data,0,data.Length);
   logger.Debug("Finished writing file {0} to disk", fileFullPath);
}

你总是可以查看文档来找到你想要的信息:如果你在.NET内核上,你可能会考虑把字节数组转换成字符数组——你意识到它们是完全不同的,不是吗?您的blob是否包含UTF-16编码的文本,除此之外没有其他内容?P.S.实现了一个TextWriter,用于以特定编码将字符写入流。我强调-因此,it StreamWriter肯定不是编写blob的最佳选择。@GSerg,我不知道数组在编码方面会完全不同。谢谢你指出这一点。我不打算发布答案。由于静态任务DownloadToDisk DbCommand命令行,您添加的代码将无法编译,具有讽刺意味的是,这是该代码与OP代码之间的唯一区别。具体来说,OP的问题是如何以异步方式执行bw.Writedata。如果您打算建议保持它的同步,但要确保整个任务都在Task.Run自己的线程上执行,那么您可以这么说,因为代码块前面的文本看起来与问题完全无关。@GSerg这是OP的问题,特别是如何以异步方式执行bw.Writedata。我告诉他这是不必要的,他应该把整个过程变成一个异步任务。将子步骤设置为异步将毫无帮助。将方法标记为异步不会神奇地使其成为非阻塞。如果您在那里有阻塞呼叫,它将阻塞。Write是一个阻塞调用。除非建议的静态任务DownloadToDisk需要是静态异步任务才能编译,否则它将与Task.Run一起调用,或在非捕获同步上下文下执行,否则它将阻止调用线程。@GSerg好的,我删除了代码。我想你现在的问题是我删除了代码?