.Net Задача отчетности о прогрессе? - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть задача, которая загружает массив байтов через веб-сервис.Я хочу сообщить о прогрессе, когда он достигнет 10, 20, 30, 40 и т. Д. Процентов.Чтобы обновить это в БД, мне нужно передать guid веб-сервису, чтобы идентифицировать файл, сообщающий о прогрессе.Я не могу достичь этого объекта изнутри задачи.Есть идеи?

Точка входа:

Guid smGuid;
smGuid = Guid.NewGuid();
Task t1 = new Task(action, pubAttFullPath);
t1.Start();
string attFullFilePath = System.IO.Path.GetFullPath(
    mailItem.Attachments[i].FileName);
string attExtension = System.IO.Path.GetExtension(
    mailItem.Attachments[i].FileName);

pubAttFullPath = attFullFilePath;

pubAttFileName = mailItem.Attachments[i].FileName;

Код задачи:

 Action<object> action = (object obj) =>
        {
            //Set filename from object
            string FileName;
            FileName = System.IO.Path.GetFileName(obj.ToString());

            //Declare Web Service
            TransferFile.TransferFile ws_TransferFile = new TransferFile.TransferFile();

            //
            bool transfercompleted = false;
            using (FileStream fs = new FileStream(
                 obj.ToString(),
                 FileMode.Open,
                 FileAccess.Read,
                 FileShare.Read))
            {
                //Declare Buffers and Counts
                byte[] buffer = new byte[49152];
                long fileSize = fs.Length;
                long totalReadCount = 0;
                int readCount;
                int currentPacketNumber = 0;
                int percentageComplete = 0;


                //Loop and copy file until it changes to not exactly the same byte count as the buffer
                //which means the file is about to complete.
                while ((readCount = fs.Read(buffer, 0, buffer.Length)) > 0)
                {
                    if (!transfercompleted)
                    {

                        totalReadCount += readCount;
                        byte[] bytesToTransfer;

                        if (readCount == buffer.Length)
                        {
                                //Copy bytes until buffer is different
                                bytesToTransfer = buffer;
                                ws_TransferFile.WriteBinaryFile(bytesToTransfer, FileName);
                                percentageComplete = (int)(totalReadCount / (double)fileSize * 100);
                            }
                        else
                        {
                            // Only a part is requred to upload,
                            // copy that part.
                            List<byte> b = new List<byte>(buffer);
                            bytesToTransfer = b.GetRange(0, readCount).ToArray();
                            ws_TransferFile.WriteBinaryFile(bytesToTransfer, FileName);
                            percentageComplete = 100;                         
                            transfercompleted = true;
                            fs.Close();
                            break;
                        }
                    }
                }
            }
        };

1 Ответ

3 голосов
/ 29 ноября 2011

Как насчет просто передать его как связанную переменную?

Guid smGuid;
smGuid = Guid.NewGuid();
Task t1 = new Task( _ => action( smGuid, pubAttFullPath ), null );
t1.Start();

Код задачи:

Action<Guid, string> action = (smGuid, FileName) =>
{
    //Declare Web Service
    TransferFile.TransferFile ws_TransferFile = new TransferFile.TransferFile();

    //
    bool transfercompleted = false;

    // And so on...
}
...