powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как протестировать методы при работе с потоками?
5 сообщений из 5, страница 1 из 1
Как протестировать методы при работе с потоками?
    #39100092
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер!
Есть такой код :
Код: 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.
class Program
    {
        static private readonly object block = new object();
        static string s = "";
        static String newFile = "File_Result.txt";        
        
        // метод для записи данных в новый файл
        static private void WriteFileAllData(String str)
        {            
            try
            {
                if (File.Exists(newFile) && str != null)
                {
                    // записываем данные в файл
                    File.WriteAllText(newFile, str);
                }
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

        // метод для считывания данных из файла
        static private string ReadDataFile(string nameFile)
        {
            try
            {                
                if (File.Exists(nameFile))
                {
                    StreamReader fs = new StreamReader(nameFile);
                    s = "";
                    s = File.ReadAllText(nameFile, Encoding.UTF8);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            return s;
        }

        static void Main(string[] args)
        {

            string str = "";
            String path_1 = @"FileOne.txt";

            try
            {
                // Считываем file_1
                if (File.Exists(path_1))
                {
                    StreamReader fs = new StreamReader(path_1);
                    str = fs.ReadToEnd();
                }

                // Записываем данные из file_1 в file_all_data и считываем данные из file_2
                // Создаём поток для записи в новый файл
                Thread threadWriteFile = new Thread(new ThreadStart(() => WriteFileAllData(str)));

                // Создаём поток для считывания данных из файла 2
                string file_2 = @"FileTwo.txt";
                Thread threadReadFile = new Thread(new ThreadStart(() => ReadDataFile(file_2)));                

                Object thisLock = new Object();
                lock(thisLock)
                {
                    threadWriteFile.Start();
                    threadReadFile.Start();                                      
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
                        
            // Записываем(дописываем) данные из file_2(переменная s) в file_all_data
            try
            {
                if (File.Exists(newFile) && s != null)
                {
                    // записываем данные в файл
                    File.AppendAllText(newFile, s);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }



Ошибка здесь при считывании file_2 - записи в file_all_data. Переменная s - пустая! Хотел протестировать метод, но при таком коде отладчик в методы не заходит. Как решить проблему?
Буду признателен за помощь!
...
Рейтинг: 0 / 0
Как протестировать методы при работе с потоками?
    #39100093
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erman,

для начала - что делает этот код
Код: c#
1.
2.
3.
 Object thisLock = new Object();
                lock(thisLock)
                {

?
...
Рейтинг: 0 / 0
Как протестировать методы при работе с потоками?
    #39100124
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erman, прежде чем браться за многопоточность научись правильно работать с файлами. Также прочитай в учебнике главу посвященную IDisposable и сборке мусора.

При работе с файлами нужно не забывать их закрывать. Ты в двух местах этого не делаешь:

Раз:
Код: c#
1.
2.
3.
4.
5.
6.
// Считываем file_1
if (File.Exists(path_1))
{
	StreamReader fs = new StreamReader(path_1);
	str = fs.ReadToEnd();
}


И два:
Код: c#
1.
2.
3.
4.
5.
6.
if (File.Exists(nameFile))
{
	StreamReader fs = new StreamReader(nameFile);
	s = "";
	s = File.ReadAllText(nameFile, Encoding.UTF8);
}


В первом случае нужно добавить fs.Close() или обернуть StreamReader в блок using. Или что еще проще вызвать File.ReadAllText.

Во втором случае который и ломает твою программу, ты открываешь StreamReader и не пользуясь им пытаешься снова открыть файл. Убери StreamReader т.к. он здесь не нужен.
...
Рейтинг: 0 / 0
Как протестировать методы при работе с потоками?
    #39100399
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилerman,

для начала - что делает этот код
Код: c#
1.
2.
3.
 Object thisLock = new Object();
                lock(thisLock)
                {

?

Создаю объект для блокировки потоков.
...
Рейтинг: 0 / 0
Как протестировать методы при работе с потоками?
    #39100416
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ermanСоздаю объект для блокировки потоков.

Шта? У тебя вот это
Код: c#
1.
2.
                    threadWriteFile.Start();
                    threadReadFile.Start();                                      



выполняется всегда в одном потоке. Тут нечего блокировать. Блокировать нужно (если нужно) в методах, которые выполняются в разных потоках
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как протестировать методы при работе с потоками?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]