안녕하세요.
저는 웹개발을 전문으로 하다보니 윈폼의 UI 개발에 개념이 좀 부족한 것 같습니다.
윈폼으로 윈도우 기능중 IIS를 설치하는 기능을 구현중에 있습니다.
윈도우에 보면 dismApi 가 제공되어 누겟에서 해당 api를 사용할 수 있게 해주는 라이브러리가 있어 적용하여 사용중입니다.
문제는 아래의 설치하려는 모듈 배열을 반복문을 통해 설치하는데요.
1개의 모듈이 설치될 때 진행바와 텍스트 박스 등에 현재 진행되고 있는 모듈 정보를 표시하려고 합니다.
어떤 모듈이 설치중인지 진행률은 어느정도인지.
문제는 반복문이 시작될 때 현재 설치되는 모듈 이름을 텍스트박스에 표시해 주고 진행률 텍스트 박스도 0%로 초기화 하고 하는 코드들이 있고 EnableFeature(featureItem) 메서드를 통해 실제 설치가 됩니다.
제가 원하는 의도는 내용이 하나의 모듈이 설치되면서 컨트롤의 내용도 바로바로 갱신이 되길 원하나 실제 동작은 반복문이 끝나고 나서 마지막 결과가 그때 반영이 됩니다. 뭔가 비동기적인 처리가 이루어 지고 있다는 느낌입니다. 이런 경우 어떤 부분을 확인해 봐야 할지 궁금합니다.
string features = new string[]
{ "IIS-WebServerRole"
,"IIS-NetFxExtensibility45"
,"IIS-ISAPIExtensions"
,"IIS-ISAPIFilter"
,"IIS-ASPNET45"
,"IIS-LoggingLibraries"
,"IIS-BasicAuthentication"
,"IIS-WindowsAuthentication"
,"IIS-HttpCompressionDynamic"
,"IIS-ManagementScriptingTools"};
//IIS 기능 사용
var featureCount = 0;
foreach (var featureItem in features)
{
featureCount++;
lblFeaturePer.Text = "0%";
prgFeature.Value = 0;
prgFeature.Update();
EnableFeature(featureItem);
txtResult.Text += featureItem + System.Environment.NewLine;
Thread.Sleep(1000);
}
//실제 기능 추가 하는 코드
public void EnableFeature(string featureName, int featureCount = 0)
{
DismApi.Initialize(DismLogLevel.LogErrorsWarningsInfo);
try
{
var session = DismApi.OpenOnlineSession();
lblFeaturePer.Text = "0%";
DismApi.EnableFeature(session, featureName, false, true, null, progress =>
{
prgFeature.Value = progress.Current / 10;
prgFeature.Update();
lblFeaturePer.Text = $"{progress.Current / 10}% / {progress.Total / 10}%";
});
}
catch (DismRebootRequiredException Ex)
{
_isReboot = true;
}
}