2017-11-06 5 views
-1

をマルチスレッド、私が主な機能であるクラスがあります。第二主関数を呼び出し、ナビゲートブラウザ後C#のWebBrowserと

public void SendSMS(SendInfo info, WebBrowser browser) 
{ 
    browser.Width = 300; 
    browser.Height = 300; 
    browser.ScriptErrorsSuppressed = true; 
    browser.DocumentCompleted += Browser_Navigated; 
    this.number = info.number; 
    this.message = info.template; 
    if (info.proxy != null) { WebRequest.DefaultWebProxy = info.proxy; } 
    debugCode = Application.OpenForms["Form1"].Controls["tabControl1"].Controls["tabPage1"].Controls["DebugCode"] as TextBox; 
    debugImage = Application.OpenForms["Form1"].Controls["tabControl1"].Controls["tabPage1"].Controls["pictureBox1"] as PictureBox; 
    MessageBox.Show("I'am start send, template: " + info.template); 
    browser.Navigate("My secret url :)"); 
} 

を:

private void SendPostRequest(string number, string message, string captcha_key, string captcha_result) 
{ 
    MessageBox.Show("Number: " + number + " Message: " + message + " key: " + captcha_key +" result: " + captcha_result); 
    string postData = "Body=" + message + "&Captcha=" + captcha_result + "&CheckboxTransliterate=false&Phone=" + number.Substring(3, number.Length - 3) + "&PhoneCode=" + number.Substring(0, 3) + "&WidgetId=" + captcha_key + "&_captcha_key=" + captcha_key + "&clearJson=true"; 
    byte[] bytes = Encoding.UTF8.GetBytes(postData); 
    HttpWebRequest sendRequest = WebRequest.Create("My secret url :") as HttpWebRequest; 
    sendRequest.Credentials = CredentialCache.DefaultCredentials; 
    sendRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"; 
    sendRequest.Method = "POST"; 
    sendRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; 
    sendRequest.Referer = "My secret url :"; 
    sendRequest.Headers.Add("Pragma", "no-cache"); 
    sendRequest.Headers.Add("Cache-Control", "no-cache"); 
    sendRequest.Accept = "application/json, text/plain, *"; 
    sendRequest.Headers.Add(HttpRequestHeader.Cookie, cookies); 
    sendRequest.ContentLength = bytes.Length; 
    sendRequest.CookieContainer = new CookieContainer(); 
    sendRequest.CookieContainer = GetUriCookieContainer(sendRequest.RequestUri); 
    using (Stream dataStream = sendRequest.GetRequestStream()) 
    {dataStream.Write(bytes, 0, bytes.Length);} 
    onSendCompleted(sendRequest.GetResponse().GetResponseStream()); 
} 

private void onSendCompleted(Stream SendResponsetStream) 
{ 
    string status = new StreamReader(SendResponsetStream).ReadToEnd(); 
    SendResponsetStream.Close(); 
    ArgumentsClass args = new ArgumentsClass(); 
    args.ResponseMessage = status; 
    args.ResponseNumber = number; 
    OnSmsSendend(this, args); 
} 

は、どのように私はそれが(そのにSMSを送信し、ボイドだ実行することができますサブ関数) 並行して実行するには、これらの関数(サブ関数を含むSMSを送信する)が必要です。 ありがとう!

P.S.私の英語のため申し訳ありません:)

+0

StackOverflowへようこそ! [質問のためのガイド](https://stackoverflow.com/help/asking)、具体的には[最小限で完全で検証可能なサンプルの作成方法](https://stackoverflow.com/help)をご覧ください。/mcve) – AesSedai101

+0

'SendSMS'と' SendPostRequest'を並行して実行しますか? –

+0

いいえ、SendSMSは自分自身でSendPostRequestを呼び出しますが、私はプログラムのメインクラスでSendSMSを並行して実行する必要があります。 –

答えて

0

あなたSendSMSは必ずしも何かを返す必要はありません。また、パラメータは、コレクション(配列または類似したもの)から来る、あなたはthis-

var tasks = new List<Task>(); 
foreach (var input in inputs) 
{ 
    tasks.Add(Task.Factory.StartNew(() => objjectInstance.SendSMS(input[info], input[browser]))); //objectInstance is class object instance 
} 

ような何かを行うことができますので、ここではinputsは、入力パラメータSendInfoWebBrowserのコレクションです。必要に応じて入力パラメータコレクションを作成する必要があります。

+0

主な問題 - 別のスレッドでブラウザを使用しています。このコードでは、WebBrowserはSTAスレッドでしか動作できないため、私は "ThreadStateException"を持っていました。 –

+0

メインスレッドでWebブラウザーを作成してSendSMS関数に渡すと、InvalidOperationExceptionエラーが発生します。 IはSendSMS関数自体にWebブラウザーを作成する場合、次にThreadStateExceptionエラーが –

+0

コード 'のforeach(VAR BeelineSendInfosでSendInfo)=新しいスレッド番目 { スレッド(()=> { beeline.SendSMS(SendInfo、新たに発生WebBrowser()); }); th.SetApartmentState(ApartmentState.STA); th.Start(); } 'は絶対に動作しません –

関連する問題