c# httpwebrequest 多线程问题 30
程序使用的是多线程方式,由于对方服务器设置了安全机制,当运行一段时间后,就需要重新拨号,更换IP。问题就在这里,当一个线程检测到需要拨号的时候,此线程进行拨号,但是其他线...
程序使用的是多线程方式,由于对方服务器设置了安全机制,当运行一段时间后,就需要重新拨号,更换IP。问题就在这里,当一个线程检测到需要拨号的时候,此线程进行拨号,但是其他线程有可能正在请求,这时候由于处于正在拨号状态,所以这些进行中的请求都会失败,当然我用catch,不会让程序中断,但很影响效率,因为这些请求会一直等待到超时后退出。有什么办法,能让程序检测到需要拨号的时候,进行中的请求直接退出,然后等待网络状态更改后再重新请求。
本想用httpwebrequest异常调用,可没用过,翻来翻去资料,也没想到如何实现。
总结:多线程操作,某线程检测需要更改IP时重新拨号,其他线程有可能处于请求中,这时候其他线程会一直等到超时后都会返回,影响效率。因为拨号需要比较频繁。 展开
本想用httpwebrequest异常调用,可没用过,翻来翻去资料,也没想到如何实现。
总结:多线程操作,某线程检测需要更改IP时重新拨号,其他线程有可能处于请求中,这时候其他线程会一直等到超时后都会返回,影响效率。因为拨号需要比较频繁。 展开
3个回答
展开全部
根据你的需求,写了个线程管理的对象:
/// <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方法即可
/// <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方法即可
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
办法是让当前需要拨号的线程终止那些需要正在请求的线程。你需要用一个全局数组存放这些现成的引用。
追问
我想想你说的,明白你意思,但是要怎么操作是个问题
追答
把相关线程的引用存放在数组中
Thread t1 = new Thread();
IList lst = new iList();
lst.add(t1);
其他类似。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询