2009-09-08 8 views
6

Tôi có một cuộc gọi đến một phương thức trả về số UIElement mà tôi gọi bằng cách sử dụng Dispatcher, bên dưới là mã.Giá trị trả về của WPF Gọi giá trị trả lại luôn là số

Tuy nhiên giá trị trả về của lệnh gọi Dispatcher luôn là NULL, bất kỳ ý tưởng nào?

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var slides = (IList<UIElement>)e.Argument; 
    var bmpSlides = new List<UIElement>(); 
    var imageService = new ImageService(); 
    int count = 0; 

    foreach (UIElement slide in slides) 
    { 
     object retVal = slide.Dispatcher.Invoke(
      new ThreadStart(() => imageService.GenerateProxyImage(slide))); 
     bmpSlides.Add(imageService.GenerateProxyImage(slide)); 
     _backgroundWorker.ReportProgress(count/100 * slides.Count); 
     count++; 
    } 

    e.Result = bmpSlides; 
} 

Trả lời

7

D'oh, dưới đây là cách để làm những gì bạn đang cố gắng để làm:

object retVal; 
slide.Dispatcher.Invoke(new Action(() => retval = imageService.GenerateProxyImage(slide))); 

Edit: Các ThreadStart ném tôi ra - đây không phải là đa luồng. Bạn đang cố gắng làm gì với mẫu mã này ??

+1

Điều này sẽ hiệu quả, nhưng có vẻ như sạch hơn với tôi khi sử dụng Func như được mô tả trong các câu trả lời khác. –

+1

Vâng thực sự Dispatcher.Invoke chờ đợi cho các chủ đề để hoàn thành, Dispatcher.BeginInvoke không ... – Zenuka

7

Đó là vì ThreadStart không có kiểu trả lại (void()).

Hãy thử điều này thay vì:

UIElement retVal = slide.Dispatcher.Invoke(new Func<UIElement>(() => imageService.GenerateProxyImage(slide))); 
1

Các documentation cho Dispatcher.Invoke bang giá trị trả về là "Giá trị trả về từ các đại biểu được triệu gọi hoặc một tham chiếu null (Không có gì trong Visual Basic) nếu các đại biểu không có giá trị trả về . " Vì đại diện ThreadStart bạn đang sử dụng bị vô hiệu, bạn cần sử dụng Func<T> hoặc đại biểu tùy chỉnh có giá trị trả lại.