任务在应该完成时不断循环
本文关键字:循环 完成时 任务 | 更新日期: 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
方法。在这里,这是故意的:))。