作者kairy (血腹兽)
看板C_Sharp
标题[问题] WPF 物件跨执行绪问题
时间Mon Oct 25 08:32:41 2010
1.原本的做法
// 有一方法可以create出Canvas物件
private Canvas createCanvas(string canvasString)
{
....
}
// 今天有某个回圈建立了Canvas的集合
IList<Canvas> canvasList = new List<Canvas>();
for(....)
{
canvasList.Add(createCanvas(..));
}
// 再把Canvas集合加到同一个Canvas, 目前为止是ok的
Canvas canvas = new Canvas();
foreach(Canvas c in canvasList)
{
canvas.Children.Add(c);
}
2. 我遇到的问题...多执行绪的做法
// 在上述的第二个回圈改为
// inner class
class ThreadParameter
{
public string CanvasContentString { get; set; }
public IList<Canvas> CanvasList { get; set; }
}
void ThreadMethod(object obj)
{
ThreadParameter para = (ThreadParameter)obj;
para.CanvasList.Add(createCanvas(para.CanvasContentString));
}
IList<Canvas> canvasList = new List<Canvas>();
IList<Thread> threadList = new List<Thread>();
for(...)
{
ThreadParameter para = new ThreadParameter() { CanvasList = canvasList,
CanvasContentString = ...};
Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod));
t.SetApartmentState(ApartmentState.STA);
threadList.Add(t);
t.Start(para);
}
foreach(Thread t in threadList)
{
// 等待执行绪跑完
t.Join();
}
// 以上都还没问题, 以下就是问题, Add到canvas的过程发生Exception
Canvas canvas = new Canvas();
foreach(Canvas c in canvasList)
{
canvas.Children.Add(c);
}
例外讯息为 "呼叫执行绪无法存取此物件,因为此物件属於另一个执行绪"
不知道怎办
试了Dispatcher的做法
Canvas canvas = new Canvas();
foreach(Canvas c in canvasList)
{
canvas.Dispatcher.Invoke(DispatcherPriority.Normal, new
AddOverLapXaml(canvas.Children.Add), c);
}
delegate int AddOverLapXaml(UIElement ui);
但仍然有Exception "引动的过程传回例外"
请问在WPF中
如果是不同Thread所建立的物件想要Add或被Add到UIElementCollection
那个做法是什麽
虽然都用主执行绪可以执行, 但效能真得有差
感恩
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.251.1.226
※ 编辑: kairy 来自: 60.251.1.226 (10/25 09:50)
1F:推 zhadow:canvas.Dispatcher 改成 Application.Current.Dispatcher 10/25 23:49
2F:→ zhadow:或用 window的 dispatcher 试看看 10/25 23:51
3F:→ kairy:To 楼上的板友, 我刚刚试了, 结果还是不行, 错误讯息是 10/26 07:38
4F:→ kairy:"引动过程的目标传回例外状况。", InnerException是 10/26 07:39
5F:→ kairy:{"呼叫执行绪无法存取此物件,因为此物件属於另一个执行绪。 10/26 07:39
6F:→ kairy:不过还是非常感谢您~ 10/26 07:39
7F:推 zhadow:那把 canvas 的create 放在UI thread中,如果 canvas 的 10/26 16:13
8F:→ zhadow:create 中跟ui无关且会占用cpu太久的部份再另外用thread做 10/26 16:14