我正在尝试让我的帐户使用任务执行多次登录。我不是专家,我刚开始,但我遇到了以下问题。
由于某种原因,任务保持循环,但它们不应该。我无法弄清问题是什么,所以我认为这里有人可能知道解决方案。
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方法。然后它继续登录帐户,但由于某种原因,任务保持循环,我真的无法弄清楚原因,因为我刚开始使用任务。如果有人可以帮助我,我真的很感激。
答案 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次?