很抱歉,如果这是一个简单的问题,但我对WP7完全不熟悉.我有一个我正在尝试使用的休息服务,但是我收到错误"无效的跨线程访问".
这是我的代码
public ObservableCollection<TransactionViewModel> Transactions { get;private set; }
public MainViewModel()
{
this.Transactions = new ObservableCollection<TransactionViewModel>();
}
public void LoadTransactions(string id)
{
var req = (HttpWebRequest)WebRequest.Create(string.Format("http://domain.com/Transactions?Id={0}", id));
req.Method = "POST";
req.ContentType = "application/json; charset=utf-8";
// call async
req.BeginGetResponse(new AsyncCallback(jsonGetRequestStreamCallback), req);
this.IsDataLoaded = true;
}
void jsonGetRequestStreamCallback(IAsyncResult asynchronousResult)
{
WebResponse response = ((HttpWebRequest)asynchronousResult.AsyncState).EndGetResponse(asynchronousResult);
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string responseString = reader.ReadToEnd();
reader.Close();
var s = JsonConvert.DeserializeObject<List<TransactionViewModel>>(responseString);
foreach (var t in s)
{
Transactions.Add(new TransactionViewModel()
{
.........
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里做过一些非常愚蠢的事吗?
当您从请求回来时,您不再在UI线程上.因此,在执行任何会影响UI的操作之前,您需要将控制权切换回UI线程.
您正在更新ObservableCollection,它将绑定在UI上,因此更新将影响UI.
有许多方法,对您来说最简单
Deployment.Current.Dispatcher.BeginInvoke(()=> {
foreach (var t in s) {
Transactions.Add(new TransactionViewModel());
}
});
编辑:此外,如果你想了解更多关于这一点,我有一篇关于它的博客文章http://csainty.blogspot.com/2010/10/windows-phone-7asynchronous-programming.html它从代码开始你看起来很合理,应该工作,解释一些问题,以及如何让它运作.