System.StackOverflowException при попытке вызвать метод Singleton - PullRequest
0 голосов
/ 17 июня 2020

Я работаю над небольшим генератором паролей в c# wpf. У меня есть класс журнала, в котором есть методы для записи сообщений в файлы. Он работал нормально, пока я не добавил журналы при проверке радио. Мой класс журнала:

public sealed class Log : MainWindow
    {
        private static Log instance = null;
        private static readonly object padlock = new object();
        public string Date;

        public bool isStarted;

        Log()
        {
            isStarted = false;
        }

        public static Log Instance
        {
            get
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new Log();
                    }
                    return instance;
                }
            }
        }

        public void ActivityLog(string message, bool start)
        {
            if(isStarted)
            {
                Date = DateTime.Now.ToString("dd'/'MM'/'yyyy HH:mm:ss");

                StreamWriter sw = new StreamWriter("activity.log", true, Encoding.ASCII);
                if (start)
                    sw.WriteAsync($"\n[{Date}] {message}\n");
                else
                    sw.WriteAsync($"[{Date}] {message}\n");

                sw.Close();
            }     
        }

        public void PasswordLog(string message)
        {
            Date = DateTime.Now.ToString("dd'/'MM'/'yyyy HH:mm:ss");
            StreamWriter sw = new StreamWriter("passwords.log", true, Encoding.ASCII);
            sw.WriteAsync($"[{Date}] {message}\n");
            sw.Close();
        }

    }

И вот код, который вызывает исключение (если я прокомментирую этот код, он отлично работает)

private void radioChecked(object sender, RoutedEventArgs e)
        {
            RadioButton radio = (RadioButton)sender;
            switch (radio.Name)
            {
                case "startUpper":
                    Log.Instance.ActivityLog("Start with set to uppercase character", false);
                    break;
                case "startLower":
                    Log.Instance.ActivityLog("Start with set to lowercase character", false);
                    break;
                case "startNumber":
                    Log.Instance.ActivityLog("Start with set to number", false);
                    break;
                case "startSpecial":
                    Log.Instance.ActivityLog("Start with set to special character", false);
                    break;
                case "startDefault":
                    Log.Instance.ActivityLog("Start with set to default", false);
                    break;
            }
        }

И есть xaml этих переключателей

<Grid Margin="0,75,0,0" HorizontalAlignment="Right" VerticalAlignment="Center" Height="190" Width="180">
            <Label x:Name="startWithLabel" Content="Start with:" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,0,0,0" FontWeight="Normal" FontSize="25" FontFamily="{StaticResource COPRGT}" Width="170" RenderTransformOrigin="0.5,0.5"/>
            <RadioButton Checked="radioChecked" x:Name="startUpper" Content="Uppercase letter" HorizontalAlignment="Left" Margin="20,50,0,0" VerticalAlignment="Top" FontFamily="{StaticResource COPRGT}"/>
            <RadioButton Checked="radioChecked" x:Name="startLower" Content="Lowercase letter" HorizontalAlignment="Left" Margin="20,80,0,0" VerticalAlignment="Top" FontFamily="{StaticResource COPRGT}"/>
            <RadioButton Checked="radioChecked" x:Name="startNumber" Content="Number" HorizontalAlignment="Left" Margin="20,110,0,0" VerticalAlignment="Top" FontFamily="{StaticResource COPRGT}"/>
            <RadioButton Checked="radioChecked" x:Name="startSpecial" Content="Special character" HorizontalAlignment="Left" Margin="20,140,0,0" VerticalAlignment="Top" FontFamily="{StaticResource COPRGT}"/>
            <RadioButton Checked="radioChecked" x:Name="startDefault" Content="Default" IsChecked="True" HorizontalAlignment="Left" Margin="20,170,0,0" VerticalAlignment="Top" FontFamily="{StaticResource COPRGT}"/>
        </Grid>

Когда я пытаюсь скомпилировать, он выдает исключение при инициализации окна InitializeComponent();

1 Ответ

3 голосов
/ 17 июня 2020

Переполнение стека обычно вызвано бесконечной рекурсией. (метод A вызывает метод B, который вызывает метод A, et c.)

Это просто безумное предположение без просмотра трассировки стека, но я предполагаю следующее:

public sealed class Log : MainWindow

Почему наследуется от MainWindow? Это означает, что весь код в MainWindow выполняется при создании нового Log. Если этот radioChecked находится в MainWindow, вероятно, именно он вызывает рекурсию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...