c# httpwebrequest 多线程问题 30

程序使用的是多线程方式,由于对方服务器设置了安全机制,当运行一段时间后,就需要重新拨号,更换IP。问题就在这里,当一个线程检测到需要拨号的时候,此线程进行拨号,但是其他线... 程序使用的是多线程方式,由于对方服务器设置了安全机制,当运行一段时间后,就需要重新拨号,更换IP。问题就在这里,当一个线程检测到需要拨号的时候,此线程进行拨号,但是其他线程有可能正在请求,这时候由于处于正在拨号状态,所以这些进行中的请求都会失败,当然我用catch,不会让程序中断,但很影响效率,因为这些请求会一直等待到超时后退出。有什么办法,能让程序检测到需要拨号的时候,进行中的请求直接退出,然后等待网络状态更改后再重新请求。
本想用httpwebrequest异常调用,可没用过,翻来翻去资料,也没想到如何实现。

总结:多线程操作,某线程检测需要更改IP时重新拨号,其他线程有可能处于请求中,这时候其他线程会一直等到超时后都会返回,影响效率。因为拨号需要比较频繁。
展开
 我来答
百度网友4e9c032
2012-06-20
知道答主
回答量:31
采纳率:0%
帮助的人:9.4万
展开全部
有个办法是你每次请求使用代理来httpwebrequest,如果不采用这个办法你只能设置httpwebrequest的超时时间了,因为当负责检测拨号的线程拨号时其他httpwebrequest线程的执行位置是不确定,所以无法通过信号方式高效的处理此问题,我建议你吧httpwebrequest超时时间设短一点,然后try一下,如果超时就重拨号(还可以设置一些侧率比如说重试拨号超过一定次数当前线程就暂停几秒)
sniper2003
2012-02-06 · TA获得超过1882个赞
知道小有建树答主
回答量:775
采纳率:100%
帮助的人:665万
展开全部
根据你的需求,写了个线程管理的对象:

/// <summary>
/// 执行方法的委托
/// </summary>
public delegate void Exec();

/// <summary>
/// 现成控制器
/// </summary>
public class ThreadControl
{
protected List<_myThread> RunningThread { get; private set; }

/// <summary>
/// 当运行中线程被终结时处罚
/// </summary>
private event Exec Terminating;

public ThreadControl()
{
this.RunningThread = new List<_myThread>();
}

/// <summary>
/// 用新线程执行方法
/// </summary>
/// <param name="func"></param>
public void NewThread(Exec func)
{
_myThread t = new _myThread(func);
this.Terminating += t.Abort;
RunningThread.Add(t);
t.Start();
}

/// <summary>
/// 终止当前正在运行的线程
/// </summary>
public void Terminate()
{
if (this.Terminating != null)
{
this.Terminating();
}
}

protected internal class _myThread
{
/// <summary>
/// 线程ID
/// </summary>
public Guid ID { get; set; }

/// <summary>
/// 获取正在运行的当前现成
/// </summary>
private Thread RunningThread { get; set; }

public _myThread(Exec ts)
{
this.RunningThread = new Thread(new ThreadStart(ts));
}

/// <summary>
/// 开始执行线程
/// </summary>
public void Start()
{
this.RunningThread.Start();
}

/// <summary>
/// 终止当前线程
/// </summary>
public void Abort()
{
this.RunningThread.Abort();
}
}
}

执行时:
ThreadControl t = new ThreadControl();
t.NewThread(Foo);
t.NewThread(Foo);
t.NewThread(Foo);
t.NewThread(Foo);
t.NewThread(Foo);
t.NewThread(Foo);

t.Terminate();

Foo是要执行的方法,签名同定义的Exec委托相同。当你需要终止正在运行的线程时,则执行这个线程控制器的Terminate方法即可
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友f4018e7
2012-02-05 · TA获得超过243个赞
知道小有建树答主
回答量:231
采纳率:100%
帮助的人:197万
展开全部
办法是让当前需要拨号的线程终止那些需要正在请求的线程。你需要用一个全局数组存放这些现成的引用。
追问
我想想你说的,明白你意思,但是要怎么操作是个问题
追答
把相关线程的引用存放在数组中
Thread t1 = new Thread();
IList lst = new iList();
lst.add(t1);
其他类似。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式