Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Lerikorner
0 / 0 / 1
Регистрация: 27.03.2016
Сообщений: 41
1

Ошибка нулевого значения объекта ("System.InvalidOperationException" в mscorlib.dll )

23.04.2016, 11:59. Просмотров 485. Ответов 1
Метки нет (Все метки)

Всем привет.
Вылетает ошибка при запаковке файла GZip'ом. При том нестабильно и нерегулярно. Проверьте плиз на своих машинах:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
using System;
using System.IO;
using System.IO.Compression;
using System.Threading;
 
namespace Compress_Decompress
{
 
    class GZipTest
    {
        static int BufferSize = 2048*2048;   //!!!!!!
 
        const int multithread= 8;//количество потоков
        public static void WriteBlock(GZipStream inStream,int read, byte[] buffer) //запись в архив из входного блока
        {
            try
            {
                Console.Write('-');
                inStream.Write(buffer, 0, read);
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
             //   error = true;
            }
 
        }
 
        public static void WriteBlockCompressed(FileStream inStream, int read, byte[] buffer)//запись архивного блока в выходной файл
        {
            Console.Write('-');
            inStream.Write(buffer, 0, read);
        }
       
        public static void Compress(string inFileName, string outFileName, bool error)//путь к входному файлу, путь к выходному файлу, флаг
        {
            try
            {
                using (FileStream inFile = new FileStream(inFileName, FileMode.Open))//инициализация входного файла
                {
                    using (FileStream comp = new FileStream(outFileName, FileMode.Create, FileAccess.Write))//инициализация выходного файла
                    {
                        //
                        // ПРИ РАБОТЕ С КОНСОЛЬЮ WINDOWS 
                        // ОБЯЗАТЕЛЬНО УКАЗЫВАЕМ ПОЛНЫЙ ПУТЬ И РАСШИРЕНИЕ ДЛЯ ВХОДНЫХ И ВЫХОДНЫХ ФАЙЛОВ!!!! 
                        //
                        using (GZipStream inStream = new GZipStream(comp, CompressionMode.Compress))//буферный поток сжатия
                        {
                            int read = 0;
                            byte[] buffer = new byte[BufferSize];
                            while ((inFile.Length > inFile.Position)||(read!=0))
                            {
                                Thread[] thread = new Thread[multithread];//множим потоки 
                                for (int i = 0; i < multithread; i++)
                                {
                                    read = inFile.Read(buffer, 0, BufferSize);
                                    Console.Write("|{0}", i);//смотрим на флаг смены потоков
                                    thread[i] = new Thread(() =>
                                    WriteBlock(inStream, read, buffer)
                                    );
                                    thread[i].Start();
                                 //   thread[i].Join();
                                }
                          //      thread[multithread].Join();
                               for(int i=0;i<multithread;i++)
                                {
                                    thread[multithread-i-1].Join();
                                }
                            }
                            inStream.Close();  //!!!!!!
 
                        }
                        comp.Close();
                    }                 
                    inFile.Close(); 
                }
                error = false;
                Console.WriteLine(" finished packing. ");
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
                error = true;
            }
        }
 
        public static void Decompress(string inFileName, string outFileName, bool error) //путь к входному файлу, путь к выходному файлу, флаг
        {
            try
            {
                FileStream inFile = new FileStream(inFileName, FileMode.Open, FileAccess.Read);//инициализация входного файла
                {
                    using (GZipStream decomp = new GZipStream(inFile, CompressionMode.Decompress))//инициализация буфера распаковки
                    {
                        //
                        // ПРИ РАБОТЕ С КОНСОЛЬЮ WINDOWS 
                        // ОБЯЗАТЕЛЬНО УКАЗЫВАЕМ ПОЛНЫЙ ПУТЬ И РАСШИРЕНИЕ ДЛЯ ВХОДНЫХ И ВЫХОДНЫХ ФАЙЛОВ!!!! 
                        //
                        using (FileStream outStream = new FileStream(outFileName, FileMode.Create, FileAccess.Write))//инициализация выходного файла
                        {
                            int read;
                            byte[] buffer = new byte[BufferSize];
                            while (inFile.Length > inFile.Position)
                            {
                                Thread[] thread = new Thread[multithread];
                                for (int i = 0; i < multithread; i++)
                                {
                                    read = decomp.Read(buffer, 0, BufferSize);
                                    Console.Write("|{0}", i);//смотрим на флаг смены потоков
                                    thread[i] = new Thread(() =>
                                    WriteBlockCompressed(outStream, read, buffer)
                                    );
                                    thread[i].Start();
                                }
                                foreach (Thread trd in thread)//закрываем все потоки
                                {
                                    trd.Join();
                                }
                            }
                            outStream.Close();
                        }
                        decomp.Close();
                    }
                inFile.Close();
                }
                Console.WriteLine(" finished unpacking. ");
                error = false;
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
                error = true;
            }
        }    
    }
 
    class Program
    {
        static string GZip, fIN, fOUT;
        static bool error = true, 
                     flag = true;
 
        public static void Main(string[] args)//параметры для командной строки должны быть закомментированы для отладки!!!!
        {
            DateTime dold = DateTime.Now;
         /*   try
            {
                GZip = args[0]; //во время работы с консолью  раскомментировать GZip, fIN, fOUT!!!!
                fIN = args[1];
                fOUT = args[2];
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message+"|| Неверно введены параметры.");
                error = true;
            }*/
 
            try
            { 
                Console.CancelKeyPress += delegate //ловим ctrl+c
                {
                    GC.Collect(); //чистим мусор
                    flag = false;
                };
                while ((true)&(flag))
                {
                    GZip = "compress";          //
                    fIN = "d:/test.avi";        //тестовые значения для отладки!!!!!
                    fOUT = "d:/test.avi.gz";    //
                    if (GZip == "compress")   
                    {
                        Console.WriteLine("packing: ");
                        GZipTest.Compress(fIN, fOUT, error);
                    }
                    else if (GZip == "decompress")
                    {
                        Console.Write("unpacking: ");
                        GZipTest.Decompress(fIN, fOUT, error);
                    }
                    flag = false;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
                error = true;
            }
            TimeSpan sp = DateTime.Now - dold;
            Console.WriteLine("press Enter to terminate! CODE {0}", error ? "1" : "0");
            Console.WriteLine("completed in {0} secs",sp);
            Console.ReadLine();
        }
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2016, 11:59
Ответы с готовыми решениями:

Ошибка: Необработанное исключение типа "System.UnauthorizedAccessException" в mscorlib.dll
static void Main(string args) { File.Create(&quot;c:\\numbers.txt&quot;); ...

Ошибка Необработанное исключение типа "System.FormatException" в mscorlib.dll
Совет по устранению: При преобразовании строки в дату выполните синтаксический разбор строки, чтобы...

Ошибка: Необработанное исключение типа "System.FormatException" в mscorlib.dll
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Необработанное исключение типа "System.IO.IOException" в mscorlib.dll
Добрый день, тут в общем код вот: using System; using System.Collections.Generic; using...

Необработанное исключение типа "System.IO.IOException" в mscorlib.dll
Здравствуйте, иногда вылетает данная ошибка: Необработанное исключение типа...

1
Lerikorner
0 / 0 / 1
Регистрация: 27.03.2016
Сообщений: 41
24.04.2016, 14:15  [ТС] 2
Подправил, но все равно, read обгоняет write, в итоге комп сходит с ума. Приходится поток write закрывать. у меня два ядра . может, в этом дело? (при попытке поставить 2 и более потоков - компьютер начинает болеть)


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public static void Compress(string inFileName, string outFileName)//путь к входному файлу, путь к выходному файлу
        {
            try
            {
                using (FileStream inFile = new FileStream(inFileName, FileMode.Open))//инициализация входного файла
                {
                    using (FileStream outFile = new FileStream(outFileName, FileMode.Create, FileAccess.Write))//инициализация выходного файла
                    {
                        //
                        // ПРИ РАБОТЕ С КОНСОЛЬЮ WINDOWS 
                        // ОБЯЗАТЕЛЬНО УКАЗЫВАЕМ ПОЛНЫЙ ПУТЬ И РАСШИРЕНИЕ ДЛЯ ВХОДНЫХ И ВЫХОДНЫХ ФАЙЛОВ!!!! 
                        //
                        using (GZipStream inGZip = new GZipStream(outFile, CompressionMode.Compress))//буферный поток сжатия
                        {
                            int i = 0, j = 0;
                            int[] read = new int[multithread];
                            byte[] buffer = new byte[BufferSize];
                            Thread[] thread = new Thread[multithread];
                            Thread[] thread_ = new Thread[multithread];
                            var mem = new MemoryStream();
                            while ((inFile.Length - inFile.Position) > BufferSize)
                            {
                                for (j = 0; (j < multithread) && ((inFile.Length - inFile.Position) > BufferSize); j++)
                                {
                                    thread[j] = new Thread(() =>
                                    {
                                        read[j] = inFile.Read(buffer, 0, BufferSize);
                                        Console.Write("- {0} -", j);
                                    });
                                    thread[j].Start();
                                    thread[j].Join();
 
                                    thread_[j] = new Thread(() =>
                                    {
                                        inGZip.Write(buffer,0, read[j]);
                                        Console.Write("|");
                                   //     Thread.Sleep(1100);
                                    });
                                    thread_[j].Start();
                                    thread_[j].Join();
 
                                }
                                for (i = 0; i < j; i++)
                                {
                                    thread[i].Join();
                                }
 
                            }
                            inGZip.Write(buffer, 0, inFile.Read(buffer, 0, BufferSize));
                            inGZip.Close();  //!!!!!!
                        }
                        outFile.Close();
 
                    }
                    inFile.Close();
                    error = false;
                    Console.WriteLine(" finished packing. ");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
                error = true;
            }
        }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2016, 14:15

Необработанное исключение типа "System.ArgumentException" в mscorlib.dll
Помогите пожалуйста, сегодня начал работу с .xml файлами, программа выдает при работе следующее: ...

Необработанное исключение типа "System.FormatException" в mscorlib.dll
Здравствуйте. имеются текстБоксы в которых вводятся цифры, при нажатии на кнопку &quot;Рассчитать&quot;...

Необработанное исключение типа "System.FormatException" в mscorlib.dll
Доброго времени суток. Столкнулся с проблемой: &quot; Необработанное исключение типа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru