0

「開始」ボタンが1つあるwinフォームがあり、それをクリックすると、.txtファイルを1行ずつ読み取り始め、サーバーにリクエストを送信します。私の質問は-「開始」をクリックしてファイルから50行を読み取り、停止して「開始」をクリックするのを待つ場合、どうすればよいですか。ここで可能な解決策はスレッド化だけですか?これは私のボタンです:

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();

ここで最も重要なのは、「開始」を1回クリックするだけでファイル全体を読み取ることではありません。別の「開始」を待つ必要があります。50行を読み取り、「開始」をクリックして2番目の50行を読み取るのを待ちます。

4

3 に答える 3

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);
                }
        }
于 2012-04-23T12:55:22.237 に答える
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;
   }
}
于 2012-04-23T09:32:30.540 に答える
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;
    }
}

50行を読み取るときにスタートボタンを無効にしてから、有効にして、さらに50行を読み取ることができるようにします。

一度に50行を読み取るのは十分に高速なので、スレッドは必要ありません。パーツにはBackgroudWorkerを使用しSend to serverます。

于 2012-04-23T09:39:22.487 に答える