J'essaie d'implémenter le mécanisme de notification de progression lors de la copie de fichiers. Je fais cela de la façon suivante:FileStream.EndWrite lève une exception (.NET)
- Je crée deux FileStreams - pour la lecture et l'écriture
- Appelez le BeginRead passer à un ReadCallback et une structure contenant le flux de lecture et la tableau à remplir avec les données lues dans un fichier.
- Dans le ReadCallback j'appelle la méthode EndRead et appeler la méthode BeginWrite sur le flux de fichier utilisé pour l'écriture passant à un WriteCallback et une structure contenant le flux (utilisés pour l'écriture) et le réseau écrire (le même que pour la partie lecture).
- Quand j'appelle le EndWrite dans le WriteCallback en lui passant la asyncResult il jette un ArgumentException: Soit l'objet IAsyncResult ne vient pas de la méthode async correspondant sur ce type, ou EndRead a été appelé à plusieurs reprises avec le same IAsyncResult
Aidez-nous à résoudre ce problème.
Mise à jour code source:
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();
}
}
Pouvez-vous fournir un échantillon de code s'il vous plaît? –
'EndRead' au lieu de' EndWrite' dans 'WriteCallback', j'ai modifié ma réponse. –
Honte à moi! Adam merci beaucoup pour votre temps précieux passé sur ma question stupide – Niccolo