에서는 Windows Forms 컨트롤에 메이크업 스레드 - 안전 통화로 비동기를 사용하는 것입니다.
private async void button1_Click_1(object sender, EventArgs e)
{
button1.Text = "Work started.";
Task myTask = new Task(DoWork);
myTask.Start();
await myTask;
button1.Text = "Work done.";
}
private void DoWork()
{
this.SetMessageText("Step 1");
Thread.Sleep(2000); // --> you can replace it with your actual method
this.SetMessageText("Step 2");
Thread.Sleep(2000); // --> you can replace it with your actual method
this.SetMessageText(" ");
}
이 대표는 TextBox 컨트롤에 텍스트 속성을 설정하기위한 비동기 호출을 할 수 있습니다 : 이것은 또한이 코드를 시도
Microsft Example에 의해 좋은 예입니다.
delegate void StringArgReturningVoidDelegate(string text);
이 메서드는 Windows Forms 컨트롤에서 스레드로부터 안전한 호출을 만들기위한 패턴을 보여줍니다.
호출하는 스레드가 TextBox 컨트롤을 만든 스레드와 다른 경우이 메서드는 StringArgReturningVoidDelegate를 만들고 Invoke 메서드를 사용하여 비동기 적으로 호출합니다.
호출하는 스레드가 TextBox 컨트롤을 만든 스레드와 같으면 Text 속성이 직접 설정됩니다.
private void SetMessageText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.label1.InvokeRequired)
{
StringArgReturningVoidDelegate d = new StringArgReturningVoidDelegate(SetMessageText);
this.Invoke(d, new object[] { text });
}
else
{
this.label1.Text = text;
}
}
내 질문에 답변 해 주셔서 감사합니다. 이 경우 정확하게 구현하는 방법에 대해 더 자세히 설명 할 수 있습니까? 나는이 질문을 게시하기 전에 연구를 해왔고 Task Asynchronous Pattern을 사용하여 문제를 해결하는 데 많은 어려움을 겪었다. 그 질문에 대한 명백한 답을 구하려고 시도하면서, 나는 우리가 여기서 본 것에 대한 질문을 어리석게 끝내었다. – Dpt
나는 그것을 구축 할 수 있도록 명시 적 응답을 요청합니다. 그냥 비동기 권고 문제는 컴파일러가 void를 반환하기 때문에 DoWork를 기다릴 수 없다는 불평을한다. 음, 알았어 .- DoWork를 비동기 작업으로 바꾼다.그러나 문제는 계속해서 예상대로 작동하지 않으며 문제 해결을 통해 매우 복잡하고 기능이 완벽하지 않은 솔루션으로 이어집니다. 이것은 내 질문에 대한 링크입니다. 자세한 내용은 다음과 같습니다. (잘 받아 들여지지 않았고 실행 가능한 솔루션을 찾지 못했습니다.) https://stackoverflow.com/questions/47520701/c-sharp -uwp-xaml-updating-controls-synchronousously – Dpt
나는 그 질문을 보았다.하지만 원래 Step1()과 Step2() 함수를 보여 주면 비동기로 만드는 법을 보여줄 수 있다고 생각한다. – rokkerboci