| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2754 人关注过本帖
标题:客户端应用程序主界面用到了多线程侦听消息出错
只看楼主 加入收藏
Moogle
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-5-21
收藏
 问题点数:0 回复次数:7 
客户端应用程序主界面用到了多线程侦听消息出错
请教各位大侠:
我在客户端应用程序主界面用到了多线程侦听消息,但出错:

未处理InvalidOperationException,Undo 操作遇到饿上下文与相应Set 操作中应用的上下文不同.可是因为在线程上Set了一个上下文但未进行还原(撤消). 

搜索更多相关主题的帖子: 应用程序主 线程 客户端 界面 侦听 
2007-06-27 09:09
bygg
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:乖乖的心中
等 级:版主
威 望:241
帖 子:13555
专家分:3076
注 册:2006-10-23
收藏
得分:0 
没关闭吗?

飘过~~
2007-06-27 10:02
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
收藏
得分:0 
把出错的那部分代码贴出来才有助于分析吧.

实践、学习、再实践、再学习......
2007-06-27 13:21
Moogle
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-5-21
收藏
得分:0 

//主窗体
public frmMain1(int subSystemID, string subSystemName)
{
this._IsNeedReg = true;
this.InitializeComponent();
this._frmMain = new frmMain();
ClientApp.MainForm = this;
// this.frmMain1_SizeChanged(null, null);
this.InitSubSystemMenu();
this.InitMenu(subSystemID, subSystemName);
this.InitFavouriteMenu();

try
{
WinUI.MessageClient.AssignMessage sms_email_client = new WinUI.MessageClient.AssignMessage();
MessageClient.SendIntantMsgClient messageClient = new WinUI.MessageClient.SendIntantMsgClient(ClientApp.CurrentUser.Employee.EmployeeKeyID);
ClientApp.InstantMessageClient = messageClient;
ClientApp.SMS_Emai_Client = sms_email_client;

ExecutionContext eC = ExecutionContext.Capture();
AsyncFlowControl afc = ExecutionContext.SuppressFlow();

Thread startTd = new Thread(new ThreadStart(ClientApp.InstantMessageClient.StartListenMessage));
startTd.Start();
//startTd.Join();
afc.Undo(); //出错后加上去,也不能解决
}
catch(Exception ex)
{
// ExceptionDealCenter.Deal("系统加载失败",
// ex, ClientApp.CurrentUser,
// "加载主窗口");

throw ex;
}

HomePage page1 = new HomePage();
page1.MdiParent = this;
page1.WindowState = FormWindowState.Maximized;
page1.Show();
ClientApp.HomePage = page1;


}

/// <summary>
/// 侦听其他客户端发送消息
/// </summary>
public void StartListenMessage()
{
if(dealOnServer == null) return ;
AsyncFlowControl afc = ExecutionContext.SuppressFlow();

callback = new MyCallbackClass() ;
//开始监听消息
dealOnServer.GetMesssageFromServer += new GetMessageFromServerEventHander(callback.SubmissionCallback);//调用服务器端代码,弹出消息窗口
afc.Undo();
}

//点击消息窗口上面的链接
private void LinkCondition()
{
showAssociate = new ShowAssociateHandler(Associate.ShowAssociate);

}
private void ShowLink()
{
object[] obj ={_InstantMessage.link};
LinkCondition();
this.Invoke(showAssociate,obj);
}

private void Title_linkLabel_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
{
try
{
if (_InstantMessage.link.UseModuleID == string.Empty) return;
AsyncFlowControl afc = ExecutionContext.SuppressFlow();
Thread Td = new Thread(new ThreadStart(this.ShowLink));
Td.Start();
afc.Undo();

}
catch (Exception ex)
{ throw ex; }
}

/// <summary>
/// 深化/链接到目标模块
/// </summary>
/// <param name="link">条件表达式</param>
public static void ShowAssociate(systemFrameWork.Message.Link link)
{
switch(link.ExecuteType)
{
case systemFrameWork.Message.ExecuteType.Show:
DataList.Container dc1 = (new DataList.Container(link.UseModuleID));
dc1.MdiParent = ClientApp.MainForm;
dc1.ShowBrowser();
break;
case systemFrameWork.Message.ExecuteType.ShowAndEdit:
string keyid = link.Condition.Substring(link.Condition.IndexOf("=") + 1);
frmTableEditor fte = (new frmTableEditor("", link.UseModuleID, null, null));
fte.MdiParent = ClientApp.MainForm;
fte.Open(keyid);
break;
case systemFrameWork.Message.ExecuteType.ShowAndList:
string sqlwhere = " and " + link.Condition.Trim();
DataList.Container dc = (new DataList.Container(link.UseModuleID));
dc.MdiParent = ClientApp.MainForm;
dc.ShowBrowser(sqlwhere);
break;
}
}

注:
AsyncFlowControl afc = ExecutionContext.SuppressFlow();
afc.Undo();
上面两行代码是出错后加上去的,还是会报错;

当某客户端发送消息后另一客户端接收到消息,并弹出消息窗口,这时候点击消息窗口上面的链接转到消息列表时出现上述错误;
新问题:{"在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级。\r\n参数名: value"};
望高手指点!谢谢!

[此贴子已经被作者于2007-6-27 17:47:21编辑过]

2007-06-27 16:57
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
收藏
得分:0 

ASP.NET?


实践、学习、再实践、再学习......
2007-06-27 18:31
Moogle
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-5-21
收藏
得分:0 
C#2005
2007-06-28 09:08
CrazyWeed0907
Rank: 2
等 级:新手上路
威 望:5
帖 子:1385
专家分:0
注 册:2006-5-30
收藏
得分:0 
在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级
windows 窗体是单线程模型,窗口一旦创建后就不能切换线程,并且对它的所有函数调用都必须在其创建线程上发生
你可以使用代理解决这个问题

“十步杀一人,千里不留行。事了拂衣去,深藏身与名。”
2007-06-28 10:33
Moogle
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-5-21
收藏
得分:0 

代理,不怎么懂?请指点!

2007-06-28 17:49
快速回复:客户端应用程序主界面用到了多线程侦听消息出错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027452 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved