시간이 많이 소요되는 메서드가있어서 BackgroundWorker를 구현하려고했지만 UI 컨트롤에 액세스 할 수 없습니다.이 UI 컨트롤을 읽고 해봤지만 아무 소용이 없습니다. 내 방법은 무엇UI 컨트롤에 액세스하는 데 시간이 많이 걸리는 작업을 수행하면서 UI를 차단하지 않는 방법은 무엇입니까?
: 새 BitmapImage
를 작성은 로컬 또는 (매개 변수)를 스트리밍 소스를 설정 ConvertToGrayscale
에 사용되는 새로운 WriteableBitmap
,에 기록하고 폴더에 IsolatedStorage
에 BW 복사를 저장합니다.
이렇게 모든 것이 매우 빠르게 발생합니다. 하지만, 25 개 미만의 소스 이미지를 말한 경우에만. 제가 100 개 이상의 Images를 가지고 있다면 이것은 20 초 이상으로 꽤 오래 걸립니다. 그러므로 동일한 PhoneApplicationPage
에 ProgressBar를 보여주고 싶습니다. 그러나 UI를 차단하지 않고 ProgressBar를 표시하는 방법에 어려움을 겪고 있습니다. 그 일을하고있다.
void GetImages()
{
if (!myIsolatedStorage.DirectoryExists("ImagesBW") && !_appsettings.Contains("_update"))
{
myIsolatedStorage.CreateDirectory("ImagesBW ");
for (int i = 0; i < coll.Desserts.Count; i++)
{
BitmapImage bmp = new BitmapImage();
bmp.CreateOptions = BitmapCreateOptions.None;
if (coll.Desserts[i].HasAssociatedImage)
{
bmp.SetSource(coll.Desserts[i].GetImage());
WriteableBitmap wb = new WriteableBitmap(bmp);
ConvertToGrayscale(wb);
BitmapImage bit = ConvertWBtoBI(wb);
SaveBWCopy(bi, i.ToString());
}
else
{
bmp.UriSource = new Uri("/Assets/Images/MissingArt.png", UriKind.Relative);
WriteableBitmap wb = new WriteableBitmap(bmp);
ConvertToGrayscale(wb);
BitmapImage bit = ConvertWBtoBI(wb);
SaveBWCopy(bi, i.ToString());
}
}
_appsettings["_firstLaunch"] = "false";
_appsettings.Save();
}
else if (myIsolatedStorage.DirectoryExists("ImagesBW ") && _appsettings.Contains("_update"))
{
string[] files = myIsolatedStorage.GetFileNames("ImagesBW/*");
for (int s = 0; s < files.Length; s++)
{
myIsolatedStorage.DeleteFile("ImagesBW/" + s + ".jpg");
}
myIsolatedStorage.DeleteDirectory("ImagesBW");
myIsolatedStorage.CreateDirectory("ImagesBW");
for (int i = 0; i < coll.Desserts.Count; i++)
{
BitmapImage bmp = new BitmapImage();
bmp.CreateOptions = BitmapCreateOptions.None;
if (coll.Desserts[i].HasAssociatedImage)
{
bmp.SetSource(coll.Desserts[i].GetImage());
WriteableBitmap wb = new WriteableBitmap(bmp);
ConvertToGrayscale(wb);
BitmapImage bit = ConvertWBtoBI(wb);
SaveBWCopy(bi, i.ToString());
}
else
{
bmp.UriSource = new Uri("/Assets/Images/MissingArt.png", UriKind.Relative);
WriteableBitmap wb = new WriteableBitmap(bmp);
ConvertToGrayscale(wb);
BitmapImage bit = ConvertWBtoBI(wb);
SaveBWCopy(bi, i.ToString());
}
}
_appsettings.Remove("_update");
_appsettings.Save();
}
btnStart.IsEnabled = true;
}
이 있어야한다'Invoke' 방법을 업데이트하려면이 옵션을 추가 할 수 있습니다. wpf에서 그것은'Dispatcher.Invoke'입니다. UI에 액세스해야 할 때'Task' 또는'Thread' (또는'BackgroundWorker')로 실행되는 백그라운드 처리를 주기적으로 차단해야합니다. 가장 좋은 경우는 한 번에 (시작 및/또는 끝에서) 모든 것을 얻을 수 있고, 호출 할 필요없이 간단하게 작업 할 수있는 경우입니다 (필요한 경우 정기적 인 상태 보고서 사용). – Sinatr
안녕하세요. 너무 늦어서 미안하지만 내 시나리오를 더 자세히 설명해 주시겠습니까? 더 잘 이해할 수 있습니까? –