wp8.1的跨线程操作ui的时候不会形成队列吗

wl****zf UID.685940
2015-04-04 发表

//后台代码
await PageInit.talkPage.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
PageInit.talkPage.AppendToLong(content,fakeid,url,time);
});
//前台页面代码
public class ItemInGroup1
{
public string Key { get; set; }

public List<Item1> ItemContent { get; set; }
}

public class Item1
{
public string Key { get; set; }
public BitmapImage l_imagesource { get; set; }
public string l_fakeid { get; set; }
public string l_content { get; set; }
public DateTime l_time { get; set; }
}

public async void AppendToLong(string content,string fakeid,string url,DateTime time )
{
ItemInGroup1 item = new ItemInGroup1();
item.Key = DateTime.Now.ToString();
Item1 tmp = new Item1();
tmp.Key = item.Key;
tmp.l_content = content;
tmp.l_fakeid=fakeid;
BitmapImage newJpg=new BitmapImage();
try
{
var Icon = await ApplicationData.Current.LocalFolder.GetFileAsync(url);
IRandomAccessStream iconStream = await Icon.OpenAsync(FileAccessMode.Read);
newJpg.SetSource(iconStream);
}
catch
{
string l = "ms-appx:///Design/getheadimg.png";
newJpg.UriSource = new Uri(l);
}
tmp.l_imagesource=newJpg;
tmp.l_time = time;
List<Item1> tt = new List<Item1>();
tt.Add(tmp);
item.ItemContent = tt;
inView.Items.Add(item);
}

后台数据更新的时候,需要即使更新到SemanticZoom,第一次循环到那个后台代码的时候正常,可是到第二次的时候就出出异常了,怀疑是前一个操作未做完,导致线程冲突了,请问这样子操作ui线程不会形成操作队列吗,一个一个有序执行吗?

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
原****我 UID.1028711
2015-04-04 回复

看起来很深奥的样子

2015-04-04 回复

线程是相互独立的,没有冲突这一说法,抛的是什么异常

2015-04-04 回复

虽然这个新的异步编程没怎么用,但你的代码里没见到有异步编程啊

我是灯柱 UID.358482
2015-04-05 回复

不会。这已经显示声明为异步了。线程也没有加同步锁。

T****" UID.352732
2015-04-05 回复

banding!Q Q{:3_94:} 帮顶

qiqiminmin UID.638527
2015-04-05 回复

最好binding,

使用observecollection

热****乐 UID.521196
2015-04-05 回复

AppendToLong没有等待返回,,其实是各跑各的,同时多个在跑,数据冲突也就很正常了。

tmp00000 UID.995403
2015-04-05 回复

有async却不加await,你确定这样不会有问题?

vbfool UID.352791
2015-04-07 回复

还是先要看是什么异常吧。

wl****zf UID.685940
2015-04-07 回复

Quote***链接停止解析***
还是先要看是什么异常吧。


“Windows.UI.Xaml.Data.ICollectionView”引发了“System.TypeAccessException”类型的异常 这个是线程冲突的问题吗

wl****zf UID.685940
2015-04-07 回复

Quote***链接停止解析***
最好binding,

使用observecollection


原先是设置绑定的,可是给数据源items添加数据没效果

qiqiminmin UID.638527
2015-04-07 回复

本帖最后由 qiqiminmin 于 2015-4-7 23:22 编辑

Quote***链接停止解析***
原先是设置绑定的,可是给数据源items添加数据没效果



不要改变 items, 要改变 items itemsSource, 最好itemsSource是 ObservableCollection

我给您一个简单例子吧
namespace加入这个
using System.Collections.ObjectModel;

private ObservableCollection<db.TrainingDayEntity> daylist;



初始化的时候
daylist = new ObservableCollection<db.TrainingDayEntity>(db.db.tds);
items.ItemsSource = daylist;


假设我的一个item tap了 (呵呵,这是我的一个方法,全部是用itemscontrol,以下方法你可以判断是那个被按了。假设我按了之后,就把第1个item加入 ObservableCollection,一定要加入这个,因为你加入这个,那么items也会跟着变)
private void Grid_Tapped(object sender, TappedRoutedEventArgs e)
{
var p0 = VisualTreeHelper.GetParent(sender as Grid) as UIElement;
var p1 = VisualTreeHelper.GetParent(p0) as StackPanel;
var id = p1.Children.IndexOf(p0);
index = id;

var itemfirst = daylist.First();

daylist.Add(itemfirst);

}

***附件停止解析***

我按了任意一个,就自动加入了
***附件停止解析***

不能用普通的 Collection 或者 IEnumrable list
要用ObservableCollection.

你最原始的数据改变的时候, 顺便把 ObservableCollection改变就行了, 这是 sqlite里的一个例子, 在viewModel里面把 observableCollection 和 items联系起来, sqlite database和 observableCollection联系起来

tmp00000 UID.995403
2015-05-07 回复

Quote***链接停止解析***
不要改变 items, 要改变 items itemsSource, 最好itemsSource是 ObservableCollection

我给您一个简 ...


用List不合适,因为内容变更时控件不能察觉。
IEnumerable还可以,只要在它的内容变更的时候重新设定ItemSource属性即可。
用Items的同时用数据绑定是可以的,我在电脑上试过。

qiqiminmin UID.638527
2015-05-07 回复

Quote***链接停止解析***
用List不合适,因为内容变更时控件不能察觉。
IEnumerable还可以,只要在它的内容变更的时候重新设定Item ...


最好不要那么做。

你这样会打来更多的问题,等于每次重新刷新一次listbox,或者listview的源。

而observeCollection只是告诉控件,哪里改变了。

微软都有mvc范例的。

比如目前有一百张图(都是来自网上的,用非常大的去试就知道了),你的列表已经移动到了第五十张,说明前五十张已经读出来了,
这个时候你重新设置 source, 那么前五十张也变成虚拟的了,你退回去,列表又要重新载入了。

hyhshiwo UID.201121
2015-05-24 回复

没必要 异步调用一个异步方法 直接调用异步方法就好了

wcavell UID.34926
2015-07-05 回复

Quote2070277517 发表于 2015-7-5 12:19
没学过,很深奥啊,线程是相互独立的,没有冲突这一说法,抛的是什么异常 ...


UI是一个独立的线程,如果多个线程对UI同时进行修改,那么就会出现问题,需要线程同步。

浩****联 UID.1018485
2015-07-11 回复

内容已屏蔽

暗****手 UID.379158
2015-07-28 回复

Quote***链接停止解析***
UI是一个独立的线程,如果多个线程对UI同时进行修改,那么就会出现问题,需要线程同步。 ...


Dispatcher.RunAsync的机制是把Task放到UI线程的执行队列中,会被UI线程顺序执行。整个进程只有一个UI线程,所以不可能做到“多个线程对UI同时进行修改”的,况且非UI线程直接操作UI元素的话会直接抛特定异常。

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报