imagelist 및 listview를로드하면 UI가 조금씩 중단됩니다. 그래서 UI를로드하고 사용자가 작업하고 있다는 것을 알려주고 backgroundWorker가 그 일을하도록하십시오. formLoad를 호출하여 "backgroundWorker1.RunWorkerAsync();"를 호출했습니다.backgroundWorker를 사용하는 동안 ListView 및 ImageList로드 중
하지만 "크로스 스레드 작업이 유효하지 않습니다 : 컨트롤 'listView1'이 (가) 만들어진 스레드가 아닌 다른 스레드에서 액세스했습니다."
나는 조금 찌르고 코드를 조금 바꿔야한다는 것을 알았습니다. 그래서 내가 무엇을 가지고 :
(listView1.InvokeRequired)을 만족하고, listView1.invoke를 실행하는 경우private void WatermarkPicker_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void GetImages()
{
DirectoryInfo dir = new DirectoryInfo(@"c:\pics");
this.listView1.View = View.LargeIcon;
this.imageList1.ImageSize = new Size(100, 100);
if (listView1.InvokeRequired)
{
listView1.Invoke(new MethodInvoker(
() => this.listView1.LargeImageList = this.imageList1));
}
else
{
this.listView1.LargeImageList = this.imageList1;
}
int j = 0;
foreach (FileInfo file in dir.GetFiles())
{
try
{
//this.imageList1.Images.Add(Image.FromFile(file.FullName));
imageList1.Images.Add(file.Name, Image.FromFile(file.FullName));
ListViewItem item = new ListViewItem(file.Name);
item.Tag = file.Name;
item.ImageIndex = j;
this.listView1.Items.Add(item);
j++;
}
catch
{
Console.WriteLine("This is not an image file");
}
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
GetCurrentLogos();
GetImages();
}
. 그러나 UI의 listView에는 아무 것도 표시되지 않습니다. 오류는 없습니다.
나는 UI를 업데이트 할 ProgressChange를 사용하는 접근 방식을 좋아한다. 그러나 UI 스레드에서 Image.FromFile을 사용하면 최종 사용자의 작업 속도가 느려질 수 있습니다. –
"크로스 스레드 작업이 유효하지 않습니다 : 컨트롤 'listView1'이 (가) 만들어진 스레드 이외의 스레드에서 액세스되었습니다." ImageList.Image.Add가 DoWork에있을 때 추가 ... –
이제 Visual Studio에서 확인했습니다. 효과적으로 많은 수의 이미지 세트에서 크로스 스레드 예외가 발생합니다. 따라서 가능한 유일한 해결 방법은 ProgressChanged 이벤트에서 ImageList.Add를 이동하는 것입니다. 이 문제를 해결할 수 있지만 파일 목록 위에 루프를 끝낼 때까지 ListView 업데이트되지 않습니다. – Steve