任务在应该完成时不断循环

本文关键字:循环 完成时 任务 | 更新日期: 2023-09-27 18:31:10

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

出于某种原因,任务会不断循环,但它们不应该循环。我真的无法弄清楚问题是什么,所以我想这里有人可能知道解决方案。

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 方法。然后它继续登录帐户,但由于某种原因,任务不断循环,我真的无法弄清楚原因,因为我才刚刚开始使用任务。如果有人能帮助我,我将不胜感激。

任务在应该完成时不断循环

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

根据您发布的代码,我希望 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方法。在这里,这是故意的:))。