任务应该在完成时保持循环

时间:2014-11-19 22:43:44

标签: c# winforms loops task

我正在尝试让我的帐户使用任务执行多次登录。我不是专家,我刚开始,但我遇到了以下问题。

由于某种原因,任务保持循环,但它们不应该。我无法弄清问题是什么,所以我认为这里有人可能知道解决方案。

public async void Login()
{
    for (int i = 0; i < objectsToCreate; i++)
    {
        try
        {
            this.Invoke((MethodInvoker)delegate()
            {
                MyEmail = listView1.Items[i].SubItems[0].Text;
                MyPassword = listView1.Items[i].SubItems[1].Text;
                MySecurity = listView1.Items[i].SubItems[2].Text;
            });
            var loginDetails = new LoginDetails(MyEmail, MyPassword, MySecurity, Platform.Ps3);
            client[i] = new FutClient();
            var loginResponse = await client[i].LoginAsync(loginDetails);
            MessageBox.Show("Succesful login");
        }
        catch (Exception ex)
        {
            string foutMelding = ex.InnerException.ToString();
            ListViewItem exception = new ListViewItem(time);
            exception.SubItems.Add(foutMelding);
            listView2.BeginInvoke(new MethodInvoker(() => listView2.Items.Add(exception)));
        }
    }
}
public void StartLogin()
{
    Task[] tasks = new Task[objectsToCreate];
    for (int i = 0; i < objectsToCreate; i++)
    {
        tasks[i] = new Task(() => Login());
    }
    foreach (Task task in tasks)
    {
        task.Start();
    }
}

我使用表单中的按钮调用StartLogin方法。然后它继续登录帐户,但由于某种原因,任务保持循环,我真的无法弄清楚原因,因为我刚开始使用任务。如果有人可以帮助我,我真的很感激。

2 个答案:

答案 0 :(得分:1)

根据您发布的代码,我希望Login()方法中循环中的逻辑执行16次:每次调用Login()方法本身时都会执行4次,因为该方法开头的for (int i = 0; i < objectsToCreate; i++)陈述;而且,这是4次,因为你要创建4个任务来调用方法。

很难知道你打算写什么,但我猜你想要从Login()方法本身删除循环。它看起来像是先前实现尝试遗留下来的一件神器。

顺便说一句:将async方法的调用与该方法的显式Task调用混合起来有点奇怪。在我看来,你只需要调用Login()方法四次就可以完成相同的结果(当然,减去Login()方法中的循环。)

以下是我如何编写代码:

public async void Login()
{
    try
    {
        MyEmail = listView1.Items[i].SubItems[0].Text;
        MyPassword = listView1.Items[i].SubItems[1].Text;
        MySecurity = listView1.Items[i].SubItems[2].Text;
        var loginDetails = new LoginDetails(MyEmail, MyPassword, MySecurity, Platform.Ps3);
        client[i] = new FutClient();
        var loginResponse = await client[i].LoginAsync(loginDetails);
        MessageBox.Show("Succesful login");
    }
    catch (Exception ex)
    {
        string foutMelding = ex.InnerException.ToString();
        ListViewItem exception = new ListViewItem(time);
        exception.SubItems.Add(foutMelding);
        listView2.Items.Add(exception);
    }
}
public void StartLogin()
{
    for (int i = 0; i < objectsToCreate; i++)
    {
        var _ = Login();
    }
}

请注意,在这种方法中,由于Login()方法最初是从UI线程调用的(我假设...你没有显示StartLogin()方法的实际调用者,在访问该方法中的UI元素时,您不需要使用Invoke()BeginInvoke()

var _ =只是为了防止编译器抱怨我没有await async方法。这里,这是故意的:))

答案 1 :(得分:1)

它不会无限循环 - 它只执行16次。这是因为你基本上有一个双嵌套的for循环 - 一个在你的StartLogin方法中,一个在你的Login方法中。也许你不希望每次调用Login方法时你的Login方法的内容执行4次?