-1

以下のコードを使用すると、リクエストを 1 つずつ処理できます。これは非同期プロセスなので、応答を取得する必要はありません。私はリクエストを渡すだけです。

class Program
{
    static void Main(string[] args)
    {
        ProfileRequestData(); 
    }

    private static void ProfileRequestData()
    { 
        ProfileRequest.Request[] req = new ProfileRequest.Request[4];
        //req.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

        req[0] = new ProfileRequest.Request();
        req[1] = new ProfileRequest.Request();
        req[2] = new ProfileRequest.Request();
        req[3] = new ProfileRequest.Request();

        req[0].Record = new ProfileRequest.RequestRecord();
        req[1].Record = new ProfileRequest.RequestRecord();
        req[2].Record = new ProfileRequest.RequestRecord();
        req[3].Record = new ProfileRequest.RequestRecord();

        req[0].Record.Id = "asdasd123";
        req[1].Record.Id = "asdasd456";
        req[2].Record.Id = "asdasd789";
        req[3].Record.Id = "addjlk123"; 

        ProfileRequest.ProfileRequestClient serviceClient = new ProfileRequest.ProfileRequestClient();

        serviceClient.ClientCredentials.UserName.UserName = @"Liberty\nzy0105";
        serviceClient.ClientCredentials.UserName.Password = "abcddf"; 

        serviceClient.ProfileRequest(req[0]);
        serviceClient.ProfileRequest(req[1]);
        serviceClient.ProfileRequest(req[2]);
        serviceClient.ProfileRequest(req[3]);
    } 
}

私がやりたいことは、すべてのリクエストを 1 つずつではなく一度に処理することです。

誰でも、要件のコードを提供できますか???

4

2 に答える 2

1

このような同時ジョブには、スレッド化メカニズムを使用する必要があります。ここでは、backgroundworkers を使用できます。

var asyncServiceRequester = new BackgroundWorker();
asyncServiceRequester.DoWork += asyncServiceRequester_DoWork;

foreach(var request in req)
{
    asyncServiceRequester.RunWorkerAsync(req);
}

これは、代わりに使用する必要があるコード スニペットです。

serviceClient.ProfileRequest(req[0]);
serviceClient.ProfileRequest(req[1]);
serviceClient.ProfileRequest(req[2]);
serviceClient.ProfileRequest(req[3]);

バックグラウンドワーカーの DoWork メソッドは次のとおりです。

static void asyncServiceRequester_DoWork(object sender, DoWorkEventArgs e)
{
    var request = e.Argument as ProfileRequest;//whatever your request type is 
    serviceClient.ProfileRequest(request);
}

アップデート:

特定の情報を提供していないため、ユーザー入力は動的な目的でリストに含まれていると想定しています。この場合、入力のリストを走査し、値をオブジェクト配列に抽出します。ここでは、最初に入力のリストを埋める方法と、それらの値をオブジェクト配列に割り当てる方法を示します。

List<TextBox> inputs = new List<TextBox>();
inputs.Add(input1);
inputs.Add(input2);
...
inputs.Add(inputN);

入力が静的である場合は、これが方法です。

List<TextBox> inputs = new List<TextBox>();
for(int i = 0; i < someNumber; i++)
{
    inputs.Add(new TextBox(){
                   Text = "some text",
                   Location = new Point(10, i * 75),
                   Height = 60,
                   Width = 150,
                   Font = new Font(ActiveControl.Font.FontFamily, 10, FontStyle.Regular)
               });
} 

残りは非常に簡単です。

var index = 0;
foreach(var tb in inputs)
{
    var newReq = new ProfileRequest.Request(){
                  Record = new ProfileRequest.RequestRecord(){
                               Id = tb.Text
                           }
              } 
    req[index++] = req; 
    // I would suggest you to use generic lists here too since they are simpler and more flexible.
    // req.Add(newReq); 
}

テキスト ファイルまたは xml から入力を収集することは、別の質問のトピックになるはずですが、同じ方法で行うことができます。ファイルまたはxmlを読み取ってから、値を動的に抽出します。

于 2013-08-07T08:46:25.700 に答える
0

リクエストを並行して処理するスレッドを作成できます -

for (int i = 0; i < req.Length; i++)
{
    new System.Threading.Thread(() => serviceClient.ProfileRequest(req[i])).Start();
}
于 2013-08-07T08:51:35.297 に答える