开发者

Invalid cross-thread access in WP7 after populating ObservableCollection within non UI thread

开发者 https://www.devze.com 2023-03-24 09:37 出处:网络
I\'m struggling with cross thread operations in WP7. Elements are successfully added do ObservableCollection but then nothing is displayed. Data binded ListBox (lBox) gives:

I'm struggling with cross thread operations in WP7. Elements are successfully added do ObservableCollection but then nothing is displayed. Data binded ListBox (lBox) gives:

Invalid cross-thread access.

Here is what I have:

public partial class MainPage : PhoneApplicationPage
{
    private ObservableCollection<string> obrazkiFinal = new ObservableCollection<string>();

    public ObservableCollection<string> ObrazkiFinal
    {
        get { return obrazkiFinal; }
        set { obrazkiFinal = value; }
    }

    // Constructor
    public MainPage()
    {
        InitializeComponent();
    }

    private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
    {
        lBox.ItemsSource = ObrazkiFinal;

        HttpWebRequest httpRequest = WebRequest.CreateHttp(@"http://website");
        IAsyncResult res = httpRequest.BeginGetResponse(new AsyncCallback(RespResult),httpRequest);
    }

    private void RespResult(IAsyncResult respResylt)
    {
        var res = (HttpWebRequest)respResylt.AsyncState;
        var resp = res.EndGetResponse(respResylt);

        /* some parsing code */
         foreach (/* found pic urls */)
         {
             //new httpwebrequest
             HttpWebRequest picHttpRequest = WebRequest.CreateHttp(picUrl);
             IAsyncResult picRes = picHttpRequest.BeginGetResponse(DownloadImageResult, picHttpRequest );

       }

    private void DownloadImageResult(IAsyncResult result)
    {
        var res = state.HttpWebRequest;
        var resp = res.EndGetResponse(result);

        /*some saving code*/

        Dispatcher.BeginInvoke(() => { ObrazkiFinal.Add(fileName); });
     }
    }
}

And then in XAML:

<ListBox Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="Auto" Name="lBox">
 <ListBox.ItemTemplate>
     <DataTemplate>
        <StackPanel>
              <Image Source="{Binding}"></Image>
        </StackPanel>
     </DataTemplate>
 </ListBox.ItemTemplate>
</ListBox>

and of course in PhoneApplicationPage:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

ObservableCollection is succesfully populated within UI thread, so what's the matter?

@edit stack trace added:

at MS.Internal.XcpImports.CheckThread() at System.Windows.DependencyObject.Ge开发者_运维技巧tValueInternal(DependencyProperty dp) at System.Windows.FrameworkElement.GetValueInternal(DependencyProperty dp) at System.Windows.DependencyObject.GetValue(DependencyProperty dp) at System.Windows.Controls.ItemsControl.get_ItemsSource() at myPhoneApp.MainPage.DownloadImageResult(IAsyncResult result) at System.Net.Browser.ClientHttpWebRequest.<>c_DisplayClassa.b_8(Object state2) at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadPool.WorkItem.doWork(Object o) at System.Threading.Timer.ring()


According to your stack trace, the DownloadImageResult accesses the ItemsSource property of (I'm assuming) your ListBox. Remove this or move it to within a BeginInvoke block.

For more specific advice, please post the full content of your DownloadImageResult function.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号