저는 현재 측정 장치의 위치를 제어 할 응용 프로그램을 작성하고 있습니다. 하드웨어가 포함되어 있기 때문에 전동기를 가동하면서 현재 위치 값을 지속적으로 폴링해야합니다. 나는이 클래스에 대한 책임을 지우려고 노력 중이며, 백그라운드 스레드에서 폴링을 수행하고 원하는 위치에 도달하면 이벤트를 발생시킵니다. 아이디어는 폴링이 나머지 응용 프로그램이나 GUI를 차단하지 않는다는 것입니다. 새로운 Threading.Task.Task 클래스를 사용하여 백그라운드 스레드 배관을 모두 처리하려고했습니다..Net 왜 Threading.Task.Task는 여전히 내 UI를 차단합니까?
아직 하드웨어가 없지만이 동작을 시뮬레이트하기 위해 테스트 스텁을 빌드해야합니다. 그러나 이와 같은 응용 프로그램을 실행하면 GUI가 여전히 차단됩니다. 아래 코드의 간단한 예를 참조하십시오 (완전하지 않으며 장치 제어를 위해 별도의 클래스를 사용하지 않음). 코드에는 일련의 측정 단계가 있으며 응용 프로그램은 각 단계마다 위치를 정한 다음 측정해야합니다.
public partial class MeasurementForm: Form
{
private MeasurementStepsGenerator msg = new MeasurementsStepGenerator();
private IEnumerator<MeasurementStep> steps;
// actually through events from device control class
private void MeasurementStarted()
{
// update GUI
}
// actually through events from device control class
private void MeasurementFinished()
{
// store measurement data
// update GUI
BeginNextMeasurementStep();
}
private void MeasurementForm_Shown(object sender, EventArgs e)
{
steps = msg.GenerateSteps().GetEnumerator();
BeginNextMeasurementStep();
}
...
...
private void BeginNextMeasurementStep()
{
steps.MoveNext();
if (steps.Current != null)
{
MeasurementStarted();
MeasureAtPosition(steps.Current.Position);
}
else
{
// finished, update GUI
}
}
// stub method for device control (actually in seperate class)
public void MeasureAtPosition(decimal position)
{
// simulate polling
var context = TaskScheduler.FromCurrentSynchronizationContext();
Task task = Task.Factory.StartNew(() =>
{
Thread.Sleep(sleepTime);
}, TaskCreationOptions.LongRunning)
.ContinueWith(_ =>
{
MeasurementFinished();
}, context);
}
}
나는 즉시 메인 스레드와 GUI로 제어 반환이 차단되지 않도록 작업이 백그라운드 스레드에 Thread.sleep를 명령을 실행하는 데 기대. 그러나 GUI는 여전히 차단됩니다. 작업이 주 스레드에서 실행되는 것과 같습니다. 내가 여기서 잘못하고있는 것에 대한 아이디어가 있습니까?
감사
Thread.Sleep 대신 무거운 알고리즘으로 테스트했는데 모든 것이 잘 작동합니다. Thread.Sleep은 항상 주 스레드에서 작동합니까? 나는 그것이 현재 스레드에서 작동 할 것으로 기대합니다. – Stefan
UI 스레드가 아니라 작업 스레드를 차단할 것으로 예상됩니다. – Stefan
무거운 알고리즘이나 Thread.Sleep()을 사용하는지 여부에 관계없이 ContinueWith()와 일련의 작업을 실행하면 UI가 차단된다는 것을 알게되었습니다. 병렬 작업을 실행할 때 무거운 알고리즘에 대해서는이 작업을 수행하지 않지만 그렇게 할 수는 없으며 작업을 순서대로 실행해야합니다. – Stefan