2012-04-23 2 views
0

У меня есть выигрышная форма с одной кнопкой «start», и когда я нажимаю на нее, начинаю читать .txt-файл по строкам и отправлять запросы на сервер. Мой вопрос: Как я могу сделать, когда я нажимаю «начать», чтобы читать 50 строк из файла, а затем остановись и дождитесь очередного щелчка «начать». Нанесение единственного возможного решения здесь? Это моя кнопка:C# winforms and threads

private void btnStart_Click(object sender, EventArgs e) 
    { 
     List<string> List = LoadFromFile("FILE"); 
     int dialogid = 0; 
     foreach (string g in List) 
     { 
      dialogid++; 
      Dictionary<string, string> parameters = new Dictionary<string, string>(); 
      parameters.Add("number", g); 
      parameters.Add("dialogid", dialogid.ToString()); 

      if (InvokeService(this.tbWebServiceURL.Text, parameters) == false) 
      { 
       MessageBox.Show("ERROR!", "ERROR"); 
       return; 
      } 
     } 

А вот мой пост запрос:

private bool InvokeService(string ServiceURL, Dictionary<string, string> parameters) 
    {   
     try 
     {   
      string data = ""; 
      int cnt = 0; 

      byte[] dataStream = Encoding.UTF8.GetBytes(data); 
      WebRequest webRequest = WebRequest.Create("URL"); 
      webRequest.Method = "POST"; 
      webRequest.ContentType = "application/x-www-form-urlencoded"; 
      webRequest.ContentLength = dataStream.Length; 

      foreach (KeyValuePair<string, string> kvk in parameters) 
      { 
       webRequest.Headers.Add(kvk.Key, kvk.Value); 
      } 

      WebResponse response = webRequest.GetResponse(); 
      Stream dataStreamResponse = response.GetResponseStream(); 
      StreamReader reader = new StreamReader(dataStreamResponse); 
      string responseFromServer = reader.ReadToEnd(); 
      Console.WriteLine(responseFromServer); 
      reader.Close(); 
      dataStreamResponse.Close(); 
      response.Close(); 

Самое главное здесь не читается весь файл с одним нажатием на «старт». Должен ждать еще один «старт». Прочитайте 50 строк и ждите, чтобы щелкнуть по «началу», чтобы прочитать секунды 50 строк. Надеюсь, теперь более ясно.

+1

Не могли бы вы использовать 'while' цикл? – Nick

+1

Вы все равно должны использовать потоки ... вы не хотите, чтобы ваш пользовательский интерфейс блокировался во время ожидания вашего файла. – Ian

+0

Я подозреваю, что этот файл не является узким местом. –

ответ

1

BackgroundWorker контур - не тестировалось:

 private void button1_Click(object sender, EventArgs e) 
     { 
      if (fileReader == null) fileReader = new StreamReader("File"); 
      string thisLine; 
      netJob bwClass = new netJob(this.tbWebServiceURL.Text); 
      for (int i = 0; i < 50; i++) 
      { 
       thisLine = fileReader.ReadLine(); 
       if(thisLine=="")break; 
       dialogid++; 
       Dictionary<string, string> newDict = new Dictionary<string, string>(); 
       newDict.Add("number", thisLine); 
       newDict.Add("dialogid", dialogid.ToString()); 
       bwClass.Fparams.Add(newDict); 
      } 
      backgroundWorker1.RunWorkerAsync(bwClass); 
     } 



    class netJob 
    { 
     private string FURL; 
     public List< Dictionary<string, string> > Fparams; 
     private Dictionary<string, string> FthisParam; 
     public string errorMess; 
     public string responseFromServer; 
     public List<string> responsesFromServer; 
     public netJob(String URL) 
     { 
      FURL = URL; 
      Fparams= new List< Dictionary<string, string> >(); 
      responsesFromServer=new List<string>(); 
      errorMess = ""; 
     } 
     public void run() 
     { 
      foreach (Dictionary<string, string> thisDict in Fparams) 
      { 
       InvokeService(FURL, thisDict); 
       if (errorMess == "") responsesFromServer.Add(responseFromServer); 
       else 
       { 
        responsesFromServer.Add(errorMess); 
       } 

      } 
     } 

     private bool InvokeService(string ServiceURL, Dictionary<string, string> parameters) 
     { 
      try 
      { 
       string data = ""; 
       byte[] dataStream = Encoding.UTF8.GetBytes(data); 
       WebRequest webRequest = WebRequest.Create("URL"); 
       webRequest.Method = "POST"; 
       webRequest.ContentType = "application/x-www-form-urlencoded"; 
       webRequest.ContentLength = dataStream.Length; 

       foreach (KeyValuePair<string, string> kvk in parameters) 
       { 
        webRequest.Headers.Add(kvk.Key, kvk.Value); 
       } 

       WebResponse response = webRequest.GetResponse(); 
       Stream dataStreamResponse = response.GetResponseStream(); 
       StreamReader reader = new StreamReader(dataStreamResponse); 
       responseFromServer = reader.ReadToEnd(); 
       reader.Close(); 
       dataStreamResponse.Close(); 
       response.Close(); 
      } 
      catch (Exception e) 
      { 
       errorMess = e.Message; 
      } 
     } 
    } 
} 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      netJob thisJob = e.Argument as netJob; 
      thisJob.run(); 
     } 


     private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
       netJob thisJob = e.Result as netJob; 
       foreach (string thisResponse in thisJob.responsesFromServer) 
       { 
        Console.WriteLine(thisResponse); 
       } 
     } 
+0

Работайте отлично. Большое спасибо. –

+0

Что? Он просто работал без каких-либо изменений? Я ничего не тестировал, я просто получил его для компиляции. –

+0

Я немного изменился и адаптировался к моей другой части кода. –

0

Не уверен, что вам нужны темы для этого. Только одна обработка - обработка 50 строк - медленная работа, т заморозить UI для этого времени, то да - вы должны делегировать эту работу к рабочему потоку, а не делать это в UI потоке, в противном случае вы должны быть хорошо с простым решением, как показано ниже:

bool isInProgress = false; 

private void OnStartButtonClick(object sender, EventArgs args) 
{ 
    // avoid multiple clicks mess 
    if (isInProgress) 
    { 
    return; 
    } 

    try 
    { 
    startButton.isEnabled = false; 
    isInProgress = true;  
    int counter = 50; 

    while (counter-- > 0) 
    { 
     var singleLine = File.ReadLine(path); 
     var message = CreateMessageFromLine(singleLine); 
     transport.PostMessageToServer(message); 
    } 
    } 
    finally 
    { 
     isInProgress = false; 
     startButton.isEnabled = true; 
    } 
} 
0

Я бы это сделать например:

private void StartButton_Click(object sender, EventArgs args) 
{ 
    StartButton.Enabled = false; 
    try 
    { 
     for (int i = 0; i < 50; i++) 
     { 
      string line = file.ReadLine(); 
      //Send to server 
     } 
    } 
    finally 
    { 
     StartButton.Enabled = true; 
    } 
} 

Disabl e кнопку запуска при чтении 50 строк, затем включите его, чтобы вы могли читать еще 50 строк.

Чтение 50 строк за один раз достаточно быстро, поэтому вам не нужны нити. Используйте BackgroudWorker для части Send to server.

+0

Уверен, что это достаточно быстро, теперь вы прокомментировали '// Отправить на сервер '. –

+0

'Send to server' закомментирован, потому что я не знаю, что он использует для отправки запроса на сервер. Я бы использовал [BackgroudWorker] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx) для части «Отправить серверу». –

+0

Я попробую этот путь сейчас. –