关于ui线程异步方法回调函数ui线程阻塞的问题

lolylyx 2012-07-14 10:02:29
先贴代码
internal Image back = new Image() { Stretch = Stretch.Fill }; //当前场景中的背景

ServiceReference1.WebServiceSoapClient WSC = new SilverlightChart.ServiceReference1.WebServiceSoapClient();

public MainPage()
{
InitializeComponent();

//this.Width = back.Width = 800;
//this.Height = back.Height = 500;
this.Background = new SolidColorBrush(Colors.Transparent);

Loaded += new RoutedEventHandler(MainPage_Loaded);

this.LayoutRoot.Children.Add(container);

Add(back, -1);

}

public void CallManage()
{
string[] parm = {"U","I"};
GetData(parm);

}

/// <summary>
/// Function to create a chart
/// </summary>
public void CreateChart(Object obj)
{
//解决跨线程访问ui对象?
this.Dispatcher.BeginInvoke(delegate
{
JsonObject json = (JsonObject)obj;

Chart chart = new Chart();

chart.ZoomingEnabled = true;
chart.ToolBarEnabled = true;
chart.ScrollingEnabled = false;
container.Children.Add(chart);
Canvas.SetLeft(chart, 5);
Canvas.SetTop(chart, 0);
});
}

private void GetData(string[] callStr)
{
SilverlightChart.ServiceReference1.ArrayOfString callArray = new SilverlightChart.ServiceReference1.ArrayOfString();
for (int i = 0; i < callStr.Length; i++)
{
callArray.Add(callStr[i]);
}

WSC.ChartCompleted += new EventHandler<SilverlightChart.ServiceReference1.ChartCompletedEventArgs>(WSC_ChartCompleted);
WSC.ChartAsync(callArray);

}

//delegate void AsyncCreatChart(JsonObject obj);
//SynchronizationContext syn;

private void WSC_ChartCompleted(object sender, SilverlightChart.ServiceReference1.ChartCompletedEventArgs e)
{ //异步调用完毕
JsonObject jsonObject = (JsonObject)JsonObject.Parse(e.Result);//e.Result为JSON文本
//这里调用后silverlight出错,是否还是阻塞ui线程,如何处理?
ThreadPool.QueueUserWorkItem(new WaitCallback(CreateChart), jsonObject);
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
App myapp = (App)App.Current;

//取得控件
HtmlElement he = HtmlPage.Document.GetElementById("serach");
//为控件注册事件
he.AttachEvent("onclick", (EventHandler)serachHanddle);


//HtmlPage.Window.Invoke("setFrameHeight", this.Height);
}

//控件事件
void serachHanddle(object sender, EventArgs args)
{
//取得html输入控件
//beginDate = HtmlPage.Document.GetElementById("beginDate").GetProperty("Value").ToString();

CallManage();
}

上面提问注释部分不太清楚如何处理,如何在不阻塞ui线程的情况下在回调函数中创建一个chart控件
也许有其它方式处理,但是我想应该有解决办法

请赐教,谢谢!
...全文
356 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lolylyx 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
提示部分完全是错误的,根本阻塞线程。而且 ThreadPool.QueueUserWorkItem也毫无意义,因为WSC_ChartCompleted根本就已经是在子线程中被回调的了。
[/Quote]

那么这里如何处理才不会阻塞ui线程呢
  • 打赏
  • 举报
回复
“调用后silverlight出错”就认真地去调试异常问题本身就行了,不要胡乱猜测。

如果这句注释是别人给你写的,那么你上当了。以后看这个人写的代码要小心,它有可能经常乱写注释。
  • 打赏
  • 举报
回复
提示部分完全是错误的,根本阻塞线程。而且 ThreadPool.QueueUserWorkItem也毫无意义,因为WSC_ChartCompleted根本就已经是在子线程中被回调的了。

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧