很抱歉,如果这是一个简单的问题,但我对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()
{
.........
}
}
我在这里做过一些非常愚蠢的事吗?
答案 0 :(得分:7)
当您从请求中返回时,您不再位于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它从你的代码开始看起来合理且应该有效,解释了一些问题和解决方法。如何让它发挥作用。