1

我有一些代码如下:

表格上:

    List<WebRequestUri> lwebrequest = new List<WebRequestUri>();

    public Form1()
    {
        InitializeComponent();
    }

    private void Start_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(new ParameterizedThreadStart((object context) =>
            {
                DoWork();
            }));
        thread.IsBackground = true;
        thread.Start();            
    }

    void DoWork()
    {
        lwebrequest = new List<WebRequestUri>();
        for (int i = 0; i < 100; i++)
        {
            WebRequestUri wp = new WebRequestUri();
            wp.Start();
            lwebrequest.Add(wp);
        }
    }

    private void Stop_Click(object sender, EventArgs e)
    {                  
        for (int i = 0; i < lwebrequest.Count; i++)
        {               
            lwebrequest[i].Abort();
        }
    }

工人阶级:

class WebRequestUri
{
    Thread thread = null;
    WebRequest webRequest = null;
    WebResponse webResponse = null;
    StreamReader sr = null;

    public void Start()
    {
        thread = new Thread(new ParameterizedThreadStart((object context) =>
            {
                SendRequest();
            }));
        thread.IsBackground = true;
        thread.Start();
    }

    public void Abort()
    {            
        if (webResponse != null) webResponse.Close();
        if (webRequest != null) webRequest.Abort();
        if (thread != null) thread.Abort();            
    }

    public void SendRequest()
    {
        webRequest = WebRequest.Create("http://google.com");

        webRequest.ContentType = "application/x-www-form-urlencoded";
        webRequest.Method = "GET";         
       try
        {
            webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest);
        }
        catch (WebException)
        {
        }
    }

    private void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        try
        {
            webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
            webResponse = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
            sr = new StreamReader(webResponse.GetResponseStream());
            string response = sr.ReadToEnd();
            Console.Write(response);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
}

当我尝试单击停止按钮时,我遇到了一个问题。我看到我的表格被阻止了。我不确定我的停止功能是对还是错。你能给我一些建议吗?谢谢

4

2 回答 2

0

看起来您正在尝试同步中止可能已经启动的 Web 请求。这些请求的处理可能正在进行中,所以我怀疑此时中止调用可能会挂起。如果您只想调用中止,我会考虑在另一个工作线程上执行此操作,以便 GUI 至少可以返回。

于 2012-08-17T09:13:22.830 回答
0

其他人已经提出了挂起的可能原因。然而,更重要的是 Thread.Abort 的实际使用。

这被认为是一件非常糟糕的事情,你不会相信它会导致大量的问题和细微的错误。

好消息是您通常并不需要它,异步任务的过早完成可以而且应该由应用程序本身处理。考虑您的用例,例如:

你想通过调用 abort 来完成什么?您是否要中止请求?你不能,因为它已经在进行中。不管对方是否有人在等它,它都会到达目的地并被处理。但是,如果您试图避免不必要的计算 - 您可以完全控制。您可以在名为“abortRequested”的类中保留一个布尔成员,Abort 方法只需将其设置为“true”。您要中止的方法需要不时检查该成员,以决定它是否应该继续执行。

如果您愿意,我们可以进一步分析您的用例。

编辑:它看起来像这样:

bool stopped = false; // can make this thread safe if you want.

// Assuming you have a computation in a loop.
compouteAsynch(){

   for(var workItme in workItems){
     if(!stopped){
      dostuff(workItem)
     }
   }
}

void stop(){
   stopped = true; // work will not stop immediately. Only in the next iteration.
}

您可以根据需要控制“停止”采样的粒度。但是,您必须知道不可能在任何地方对其进行采样。例如-当线程对数据库执行查询时,您无法检查它。不过,这应该足够好了。

于 2012-08-17T09:48:05.680 回答