在上一个问题中,我询问了如何在回调线程中访问UI元素。我得到了很多很好的答案,其中一个是实现这样的包装类:
public static class UIThread
{
private static readonly Dispatcher Dispatcher;
static UIThread()
{
Dispatcher = Deployment.Current.Dispatcher;
}
public static void Invoke(Action action)
{
if (Dispatcher.CheckAccess())
{
action.Invoke();
}
else
{
Dispatcher.BeginInvoke(action);
}
}
}
你可以使用
来调用它UIThread.Invoke(() => TwitterPost.Text = "hello there");
但是我尝试通过在回调函数中调用以下函数来扩展它
UIThread.Invoke(() => loadUserController(jsonObject));
使用以下方法:
private void loadUserController(JObject jsonObject)
{
string profile_image_url = (string)jsonObject["profile_image_url"];
string screen_name = (string)jsonObject["screen_name"];
string name = (string)jsonObject["name"];
string location = (string)jsonObject["location"];
int statuses_count = (int)jsonObject["statuses_count"];
if (!string.IsNullOrEmpty(profile_image_url))
{
ProfileImage.Source = new BitmapImage(new Uri("blahblahbalhb.jpg", UriKind.Absolute));
}
// Set the screen name and display name if it differs
if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(screen_name))
{
ScreenName.Text = screen_name;
if (!screen_name.Equals(name))
{
_Name.Text = name;
}
}
if (!string.IsNullOrEmpty(location))
{
Location.Text = location;
}
Tweets.Text = statuses_count.ToString() + " Tweets";
}
然后图像将不会渲染,直到另一个动作强制重绘(单击按钮),但文本控件将更新。如果在我的回调函数中,我调用setImageFile(string imageFile),它实现为:
private void setImageFile(string imageFile)
{
if (this.Dispatcher.CheckAccess())
{
ProfileImage.Source = new BitmapImage(new Uri("fdsfdfdsf.jpg", UriKind.Absolute));
}
else
{
this.Dispatcher.BeginInvoke(new Action<string>(setImageFile), imageFile);
}
}
然后立即渲染图像。为什么会这样?我不完全理解Dispatcher的哪些属性?
答案 0 :(得分:0)
我强烈建议你不这样做。 SynchronizationObject
旨在处理此类情况,以及AsyncOperation
和AsyncOperationManager
。
SynchronizationObject
的唯一缺点是无法测试代码是否已在正确的线程上运行。这应该不是问题,因为业务逻辑代码应该始终了解其线程上下文。