[C#] 메인 윈도우와 쓰레드 사이 어딘가에서쯤의 레지스트리의 사용

Jaemoon Lee·2023년 3월 20일
0

[C샾]

목록 보기
10/13

이전에 레지스트리에 이은...
중요하지만 여담 같은 이야기이다.

보통 우리가 레지스트리를 쓸 때의 방법을 보자.

using Microsoft.Win32;

public partial class MainWindow : Window
{
	public RegistryKey reg;
    
    	public MainWindow()
        {
        	reg = Registry.CurrentUser.CreateSubKey("SOFTWARE").CreateSubKey("SW_ENV").CreateSubKey("SETTING");
            reg.SetValue("IP", Properties.Settings.Default.severIp);
        }
}

위 코드는
1.메인 윈도우 상에서 Public으로 사용할 reg라는 RegistryKey 클래스를 선언하고,
2. MainWindow 함수 내에서 SOFTWARE\SW_ENV\SETTING\의 IP 레지스트리 키 값을 severIp라는 프로퍼티 변수에 대입시키는 기능을 간단하게 구현한 코드이다.

맨 위를 보면.. 한번 class MainWindow : Window에 퍼블릭 레지스트리 클래스 reg를 선언했기 때문에 다른 클래스에 레지스트리 참조 및 수정을 하고싶을 때

static void DisplayCount(string message)
{
	Application.Current.Dispatcher.Invoke(() =>
	{
		((MainWindow)System.Windows.Application.Current.MainWindow).reg = Registry.CurrentUser.CreateSubKey("SOFTWARE").CreateSubKey("SW_ENV").CreateSubKey("SETTING");
		((MainWindow)System.Windows.Application.Current.MainWindow).reg.SetValue("COUNT", textTopBoard_Count.Content);
	});
}

위 코드와 같이 사용할 수 있게된다.
...는 일반적인 상황에서는 가능하다...
정확히 말하자면
"MainWindow를 위 Display... 처럼 메인을 바꾸는 상황"이거나,
"메인 윈도우에 지장이 가지 않는" 상황에서만 사용이 가능하다.

즉...

//메인 윈도우 상에서 진행
public partial class MainWindow : System.Windows.Window
{
//서버로부터 오는 메시지를 리시브하는 루프
	static Action loopReceiveServer = () =>
	{
    //리시브 루프가 무한히 돌도록 함
		while (Store.getInstance().runningLoops)
		{
        //서버로부터 메시지를 받을 때,
			if (Store.getInstance().server.IsMessage())
			{
            //받은 메시지 중 <PINCOUNT>라는 메시지가 있을 때
				else if (message == "<PINCOUNT>")
				{
                //Count라는 함수를 실행
					Count();
                    
...

//위에서 호출한 Count 함수의 정의
static void Count()
{
	Application.Current.Dispatcher.Invoke(() =>
	{
	((MainWindow)System.Windows.Application.Current.MainWindow).reg = Registry.CurrentUser.CreateSubKey("SOFTWARE").CreateSubKey("SW_ENV").CreateSubKey("SETTING");
	string reg_ID = ((MainWindow)System.Windows.Application.Current.MainWindow).reg.GetValue("ID").ToString();
    
...
//해당 함수 내에서는 타이머 돎.

위 코드와 같이 메인 윈도우 상에서 특정 While 루프문을 실행시킬 때 + 해당 루프 안에서 잠시 작업을 중지하고 타이머와 같은 사유로 대기해야할 때
MainWindow를 참조하는 reg를 호출하는 순간...
타이머의 대기 시간 내내 Main의 reg를 참조하는 잠깐동안 메인 윈도우 전체가 멈추는 현상이 발생할 수 있게 되는 것이다.

※ 확인해야될 포인트는 Count 함수 내의
Application.Current.Dispatcher.Invoke(() => 이다.

아무튼... 그렇기 위해서는 2가지 조치를 취해주면 된다.

  1. Count 함수에서
    Application.Current.Dispatcher.Invoke(() =>
    를 사용하지 않고,

  2. 함수 내부에 reg를 다시 선언해서 사용할 것...

static void Count()
{
	//Count 함수 내에서 reg 다시 선언
	RegistryKey reg = Registry.CurrentUser.CreateSubKey("SOFTWARE").CreateSubKey("SW_ENV").CreateSubKey("SETTING");

	//새로 선언한 reg에서 reg_ID 정의하는 레지스트리 호출
	string reg_ID = reg.GetValue("ID").ToString();
    
    ...
profile
초보개발세발자

0개의 댓글