-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]);
    } 
}

我想做的是一次处理所有请求,而不是一一处理。

任何人都可以,请提供要求的代码???

4

2 回答 2

1

对于像这样的同时作业,您应该使用线程机制。在这里你可以使用后台工作者。

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 回答