CSDN-CSDN社区-.NET技术-C#

收藏 请教各位关于WPF中的多线程问题[问题点数:100]

  • liuyong82
  • (MX1000)
  • 等 级:
  • 结帖率:
楼主发表于:2008-02-24 10:36:56
小弟在做一个类似于msn的聊天程序,用的是udp 协议,后台有一个监听线程,
private void sockUDP1_DataArrival(byte[] Data, System.Net.IPAddress Ip, int Port)
        {
            this.Dispatcher.BeginInvoke(DispatcherPriority.Normal , new DataArrivaldelegate(DataArrival), Data, Ip, Port);         
        }

用来接收其他客户端发送的指令,例如是发送文件还是传递消息,或者是有其他用户登录.

当发送文件时,我用
Dispatcher.Invoke(DispatcherPriority.Normal, new SendFileData(sendFileData), fStream);来启用一个发送文件的新线程.

为了保证发送文件可以被接受者正确地收到,我每次发送一定字节数后,就会等待接受者返回消息,这个是由前面的sockUDP1_DataArrival进程收到并处理的,
现在问题是,文件发送线程sendfileData中,我用

while(currSendPos <this.FileSize && !userCancelSend)
{
if(currSendPos==this.pSendPos) //pSendPos就是等待接受者发送的消息中所更新目前他的接受状态.
.....
}
等待接受者发送的消息,然而接受者发送的消息一直没有收到,所以一直死在while循环中.
但实际情况是,接受者已经发送消息,而这些消息却没有被DataArrival处理反而一直等待while结束时才被处理.

请问我该如何解决该问题?


回复次数:10
  • wsj1983920用户头像
  • wsj1983920
  • (我就是健->改名为 斯文)
  • 等 级:
#1楼 得分:0回复于:2008-02-24 11:15:52
关注一下  友情帮顶
#2楼 得分:0回复于:2008-02-24 20:09:33
大家帮忙看一下阿.
#3楼 得分:0回复于:2008-02-24 20:23:10
常规的消息传输机制是有时间限制的,比如TCP协议中的数据传输,网络上的数据没也不能保证一定传到,所以当数据出现异常而使接收方收不到时,应有时间限制退出循环,建议设计时使用自动机机制.

随便发表点不专业的帖子....:(
#4楼 得分:0回复于:2008-02-25 01:51:09
mark.
  • syeerzy用户头像
  • syeerzy
  • (快乐永远*先天下之乐而乐*后天)
  • 等 级:
#5楼 得分:0回复于:2008-02-25 03:46:44
我理解力有问题,看不出来说的是什么。。。
#6楼 得分:0回复于:2008-02-25 09:03:55
就是说如何使一个线程在运行while语句中,不影响另一个一个线程的正常运行.
  • wodegege10用户头像
  • wodegege10
  • (人在江湖飘 哪能不挨刀...两)
  • 等 级:
#7楼 得分:0回复于:2008-02-25 09:34:36
关键是你没有开始一个新的线程,
你只是进行了异步调用,
你需要使用Thread,或者线程池的东西
  • kbryant用户头像
  • kbryant
  • (假扮的天使)
  • 等 级:
  • 3

#8楼 得分:0回复于:2008-02-25 09:37:20
进来学习了
#9楼 得分:0回复于:2008-02-25 20:30:28
谢谢大家的热情的回复.

好象不能用Thread新开一个线程,会报错"由于其他线程拥有此对象,因此调用线程无法对其进行访问".
#10楼 得分:0回复于:2009-03-13 14:36:10
.net3.0 中跨线程访问控件 与以往不同。
在wpf中
如果现在还按照以前的使用方式(在UI线程中声明其一个实例,并在新线程中使用它)来使用,你就会收到一个“由于其他线程拥有此对象,因此调用线程无法对其进行访问。”的System.InvalidOperationException。正确使用它的方式是使用Dispatcher的Invoke或BeginInvoke方法:
相关问题
请教:WPF中的Invoke
关于WPF的消息循环问题