SocketException: 由于线程退出或应用程序请求,已放弃I/O操作" 解决方案

 1 1、private static ManualResetEvent posReceiveDone = new ManualResetEvent(false);
 2
 3 2、posThread = new Thread(delegate() { Pos(); }); posThread.Start();
 4
 5 3、public void Pos()
 6
 7 {
 8
 9   ……//填写必要代码
10
11      PosSocket.BeginReceive(PosMsgBuffer, 0, 2, 0, new AsyncCallback(PosReceiveCallBack), null);
12 //由于此函数是被线程调用,而线程在执行了BeginReveive后,EndReceive之前,线程资源就可能已释放或者退出,所以要在此处等待,直到接受完数据之后,收到返回的指示时,再返回
13      posReceiveDone.WaitOne();
14
15 }
16
17 4、private void PosReceiveCallBack(IAsyncResult AR)
18
19     { int REnd = PosSocket.EndReceive(AR);
20
21       NuberData = new byte[2];
22
23       NuberData[0] = PosMsgBuffer[0];
24
25       NuberData[1] = PosMsgBuffer[1];
26
27       int s = (NuberData[0] << 8) + NuberData[1];
28
29       Byte[] getbuffer = new Byte[s - 2];
30
31       int i;
32
33       for (i = 0; i < getbuffer.Length; i++)
34
35       {
36
37         PosSocket.Receive(getbuffer, i, 1, SocketFlags.None);
38
39       }
40       //线程同步,指示可以返回了
41       posReceiveDone.Set();
42
43      ……//填写必要代码
44
45 }

在beginreceive异步执行完成之前,让当前线程等待他执行完posReceiveDone.waitone();回调执行玩以后 posReceiveDone.set();让线程继续。

如果不停止线程执行的话,他在beginreceive之后,线程因为没有事情可做,所以就会直接结束当前线程。

因为他是异步的,所以线程不会等beginreceive的回调执行完再继续。

时间: 2024-10-27 08:31:06

SocketException: 由于线程退出或应用程序请求,已放弃I/O操作" 解决方案的相关文章

[转载]DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁

(转载于breaksoftware的csdn博客) 我们回顾下之前举得例子 case DLL_PROCESS_ATTACH: { printf("DLL DllWithoutDisableThreadLibraryCalls_A:\tProcess attach (tid = %d)\n", tid); HANDLE hThread = CreateThread(NULL, 0, ThreadCreateInDllMain, NULL, 0, NULL); WaitForSingleO

Linux之nohup命令:实现退出终端后程序继续后台运行

转自:http://tech.ccidnet.com/art/302/20070618/1115599_1.html 简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站有文章介绍过),比较麻烦:另一种方法是仍然用普通方法编程,然后用nohup命令启动程序: nohup<程序名>& 则控制台logout后,进程仍然继续运行,起到守护进程的作

Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7932268 在前面一篇文章中,我们分析了Android应用程序请求SurfaceFlinger服务创建Surface的过程.有了Surface之后,Android应用程序就可以在上面绘制自己的UI了,接着再请求SurfaceFlinger服务将这个已经绘制好了UI的Surface渲染到设备显示屏上去.在本文中,我们就将详细分析Android应用

线程退出前操作

#include <unistd.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> void cleanup() { printf("cleanup\n"); } void *test_cancel(void) { pthread_cleanup_push(cleanup,NULL); printf("test_cancel\n"); whil

015 线程退出 启动

线程退出 启动  ● 当一个进程销毁的时候 ○ 销毁临时对象 ○ 释放堆栈 ○ 将返回值设置为我的退出代码 ○ 减少进程内核对象的使用次数 ● 当一个线程销毁的时候 ○ 销毁临时对象 调用我的们的析构函数 ○ 释放当前线程里面锁分配堆栈 -> 窗口 -> HOOK ○ 将返回值设置为我的退出代码 线程的入口函数的返回值设置为我的退出代码 ○ 减少进程内核对象的使用次数 ● ExitThread 立即结束当前线程 ● TerminateThread 可以结束其他的线程 ● Exit ○ 会将属于

退出当前应用程序

/* *退出当前应用程序 */ + (void)exitApp; + (void)exitApp{ UIWindow *window = [[UIApplication sharedApplication].delegate window];    //添加动画    [UIView animateWithDuration:2.0f animations:^{        window.alpha = 0;    } completion:^(BOOL finished){          

MVC应用程序请求密码的功能(一)

经过一系列的练习,实现了会员注册<MVC会员注册>http://www.cnblogs.com/insus/p/3439599.html,登录<MVC应用程序实现会员登录功能>http://www.cnblogs.com/insus/p/3466512.html,以及注销<MVC会员注销功能Cookie的应用>http://www.cnblogs.com/insus/p/3471147.html等功能. 还差一些什么呢?会员忘记密码时,能够请求密码或是重置自己的密码.现

MVC应用程序请求密码的功能(二)

在完成<MVC应用程序请求密码的功能(一)>http://www.cnblogs.com/insus/p/3471534.html之后,如果你照着做,所有请求只会列在MailingList表中,并没发送出去. Insus.NET现在就继续下去,让这个功能能尽量完美下去. 在上一篇中,有一个存储过程: 在这个存储过程#38与#39行代码,是一个超链接,它是真正存在MVC的应用程序中.也就是说,给会员发送邮件时,就是把这个链接的视图发送至会员的邮箱中.因此,我们得创建这个视图. 创建这个视图,得先

android学习——退出整个应用程序

将下面SysApplication这个类复制到工程里面,然后在每个Acitivity的oncreate方法里面通过SysApplication.getInstance().addActivity(this); 添加当前Acitivity到ancivitylist里面去,最后在想退出的时候调用SysApplication.getInstance().exit();可直接关闭所有的Acitivity并退出应用程序. package com.example.Emotional.util; import