발생 전 상황 실시간 타이머를 사용 하려고 하였으나, .exe 종료와 함께 액세스 할 수 없다는 파업창이 발생 하였습니다.
발생 원인 데이터를 수신하는 스레드에서 프로그램 화면을 갱신시 문제가 발생.
원인 해결 방법 Dispatcher.Invoke(DispatcherPriority, Delegate)을 사용하여 주세요. - [[여기]] 선택하시면 더욱 자세한 설명을 볼 수 있습니다. - Dispatcher가 연결된 스레드에서 지정된 대리자를 동기적으로 실행합니다. 그러면 메인스레드와 동기화 되어 진행이 됩니다.
마무리. txthour.Text = sqptime.ToString();를 Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { txthour.Text = sqptime.ToString(); })); 으로 변경하여 진행 하였더니, 이상없이 잘 진행 되었습니다.
.NET Framework 이점 ·아무것도 모르는 상태에서, 빠르게 진행이 필요 할 경우, .NET Framework를 선택하세요. - .NET Core의 경우는 학습이 조금 더 어렵습니다. · .NET Framework는 현재 버전인 4.8이 마지막 버전으로 간주됩니다. - 지속적인 업그레이드와 변경을 하고 싶지 않을 경우 선택하세요. · 일하는데 안정적인 환경을 줍니다.
.NET Core 장점 · 새로운 프로그램을 구축해야 한다면 .NET Framework보다는 .NET Core이 좋습니다. - 마이크로 소프트사에서는 .NET Core v3.0을 발표했습니다. - 미래의 경우 .NET Core가 될 수 있습니다. · .NET Core 3.0 발표 - WPF에서 Windows Forms을 지원합니다. 즉. UWP/WPF 및 Windows Forms 간의 교차 개발도 지원합니다. 이것은 최신 UWP 인터페이스를 Windows Forms 및 WPF로 가져올 수 있는 유연성을 제공합니다.
.NET 생태계 .Net Core · 윈도우, 리눅스, macOS 사용 가능합니다. - 모든 운영 체제에 대한 응용 프로그램을 구축하기 위한 새로운 오픈 소스 및 크로스 플랫폼 프레임 워크 입니다. - UWP 및 ASP.NET Core 만 지원합니다. - ASP.NET Core는 브라우저 기반 웹 응용 프로그램을 작성하는 데 사용합니다. · 경량화로 인해 매우 가볍다 · Docker 사용 가능
.Net Framework · 윈도우 및 웹 응용 프로그램을 사용 가능합니다. - Windows Forms, WPF/UWP를 사용하여 Windows 응용 프로그램을 빌드 할 수 있습니다. - ASP.NET MVC는 웹 응용 프로그램 작성에 사용합니다. · 다양한 기능과 확장성을 지원
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
DataContext = Et.GetEt();
}
}
public class Et
{
public string Name { get; set; }
public string Age { get; set; }
public static Et GetEt()
{
var emp = new Et()
{
Name = "Gelato",
Age = "20's"
};
return emp;
}
}
using Windows.UI.Xaml.Controls;
public sealed partial class MainPage : Page
{
Person person = new Person { Name = "철수", Age = 27 };
public MainPage()
{
this.InitializeComponent();
this.DataContext = person;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string message = person.Name + " is " + person.Age + " years old";
txtblock.Text = message;
}
}
public class Person
{
private string nameValue;
public string Name
{
get { return nameValue; }
set { nameValue = value; }
}
private double ageValue;
public double Age
{
get { return ageValue; }
set
{
if (value != ageValue)
{
ageValue = value;
}
}
}
}
public sealed partial class MainPage : Page
{
Random r = new Random();
int[] check = new int[10]; //new int가 아닌 int만 작성시, "잘 못된 식의 항'int'입니다" 메세지뜬다. 그 이유는 new 동적으로 할당 된 메모리를 담당.
//new 오른쪽에 선언 된 변수에 반환된다. 숫자 10개를 입력 받는다. 입력 받는 값은 동적 값이다.(프로그램 실행 할 때마다 변경되는 값)
//정수 배열 생성, 초기값 0 할당됨, 랜던값 : 10개
List<int> lstRandom = new List<int>(); //List :: 배열과 동일한 역활을 한다. List<자료형> 변수명 형태로 선언하고, 객체라서 new 연산자 작성 필수!!
public MainPage()
{
this.InitializeComponent();
}
private void btnRand_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 10; i++)
{
int v = r.Next(10); //Next(10) :: 문자 또는 문자열을 공백을 기준으로 한단어 또는 한문자씩 입력 받는다. //NextLine(10) :: 문자 또는 문장 한라인 전체를 입력 받는다.
while (RndCheck(v) == false) //While 문은 false면 반복한다. //생성된 랜덤값은 RndCheck() 메서드로 보내서 처음 나온 값인지 체크하여 처음 나온 값이라면 lstRandom에 추가한다.
v = r.Next(10);
lstRandom.Add(v); //Add(i) :: Add는 추가적으로 선택 해야 할 때 사용 합니다. 추가로 i요소를 선택 합니다.
}
foreach (var i in lstRandom) //foreacg는 https://blockdmask.tistory.com/313 설명 참고
lstRand.Items.Add(i); //Items :: lstRand의 항목을 가져옵니다.
btnRandom.IsEnabled = false; //IsEnabled :: 이 요소를 사용자 인터페이스에서 사용 할 수 있는지 여부를 나타내는 값을 가져오거나 설정 합니다.
}
private bool RndCheck(int v) //check[v]의 값이 0이면 true를, 1이면 false를 리턴한다.
{
if (check[v] == 0)
{
check[v] = 1;
return true;
}
else
return false;
}
private void btnReset_Click(object sender, RoutedEventArgs e) //Reset 버튼이 클릭되었을 때 실행되는 이벤트 처리 메서드, 리스트박스를 지워주고, check[] 배열과 리스트 lstRandom을 초기화한다다.
{
lstRand.Items.Clear(); //Clear() :: 요소 모두 제거 // Itme을 통하여 lstRand의 항목을 가지고와 Clear()으로 지운다.
for (int i = 0; i < 10; i++)
check[i] = 0;
lstRandom.Clear();
btnRandom.IsEnabled = true;
}
}