【发布时间】:2010-07-21 22:44:27
【问题描述】:
我正在尝试在复制文件时实现进度通知机制。 我正在通过以下方式执行此操作:
- 我创建了两个 FileStreams - 用于读取和写入
- 调用 BeginRead 并传递给它一个 ReadCallback 和一个包含读取流的结构和用于填充从文件中读取的数据的数组。
- 在 ReadCallback 中,我调用 EndRead 方法并在用于写入的文件流上调用 BeginWrite 方法,传递给它一个 WriteCallback 以及包含流(用于写入)和要写入的数组(与读取部分相同)的结构。
- 当我在 WriteCallback 中调用 EndWrite 并将 asyncResult 传递给它时,它会引发 ArgumentException:IAsyncResult 对象不是来自相应的异步方法在这种类型上,或者 EndRead 被多次调用并使用相同的 IAsyncResult
请帮助解决这个问题。
更新源码:
private void StartAsyncCopying()
{
var sourceFileInfo = new FileInfo(Source);
if (!sourceFileInfo.Exists)
{
throw new FileNotFoundException("File not found.",
Source);
}
m_sourceLength = sourceFileInfo.Length;
m_readerStream = new FileStream(Source, FileMode.Open);
m_writerStream = new FileStream(Target, FileMode.Create);
m_queueBuffer = new Queue<byte[]>(DefaultQueueBufferSize);
m_queueBufferLock = new object();
ProgressRead();
}
private void ProgressRead()
{
var readerChunck = new byte[DefaultChunckSize];
var streamChunck = new StreamChunck(readerChunck, m_readerStream);
m_readerStream.BeginRead(streamChunck.Chunck,
0,
streamChunck.Chunck.Length,
ReadCallback,
streamChunck);
}
private void ReadCallback(IAsyncResult asyncResult)
{
var streamChunck = asyncResult.AsyncState as StreamChunck;
var numberOfBytesRead = streamChunck.Stream.EndRead(asyncResult);
m_readerOffset += numberOfBytesRead;
ProgressWrite(streamChunck.Chunck);
}
private void ProgressWrite(byte[] chunck)
{
var streamChunck = new StreamChunck(chunck, m_writerStream);
m_writerAsyncResult = m_writerStream.BeginWrite(streamChunck.Chunck,
0,
streamChunck.Chunck.Length,
WriteCallback,
streamChunck);
}
private void WriteCallback(IAsyncResult asyncResult)
{
var streamChunck = asyncResult.AsyncState as StreamChunck;
var numberOfBytesWritten = streamChunck.Stream.EndRead(asyncResult);
m_writerOffset += numberOfBytesWritten;
var progressChangedEventArgs = new CopyProgressChangedEventArgs(m_operationDescription,
m_sourceLength,
m_writerOffset);
OnCopyProgressChanged(progressChangedEventArgs);
if (m_writerOffset == m_sourceLength)
{
var copyCompletedEventArgs = new CopyCompletedEventArgs(m_operationDescription, null);
OnCopyCompleted(copyCompletedEventArgs);
}
else
{
ProgressRead();
}
}
【问题讨论】:
-
能否提供一些示例代码?
-
EndRead而不是WriteCallback中的EndWrite,我已经修改了我的答案。 -
真丢脸!亚当非常感谢您在我的愚蠢问题上花费的宝贵时间
-
一点也不傻——有时我们只见树木不见森林——每个人都会遇到。在相关说明中,野餐错误意味着“椅子上的问题,而不是电脑上的问题”:-) 快乐编码。
标签: .net filestream