InvalidOperationException 执行两次处理时

Fly*_*ast 5 .net wcf windows-phone-8

我必须编写一个异步方法来与 Web 服务联系。这是我在 WebServiceHelper 类中的方法:

 public static Task<int> SignIn(string username, string password) 
    {

        try
        {
            TaskCompletionSource<int> tcs = new TaskCompletionSource<int>();
            service.LoginCompleted += (object sender, WebService.LoginCompletedEventArgs e) => 
            {
                if (e.Error != null) tcs.SetResult(-1);
                else
                    tcs.SetResult((int)e.Result);

            };
            service.LoginAsync(username, password);
            return tcs.Task;
        }
        catch (Exception ex)
        {

            MessageBox.Show("Error: " + ex.Message);
            return null;
        }

    }
Run Code Online (Sandbox Code Playgroud)

然后我在一个按钮点击事件中调用它,如下所示:

private async void btLogIn_Click(object sender, RoutedEventArgs e)
    {                       
        try
        {
            int si = await WebServiceHelper .SignIn(tbUsername.Text, tbPassword.Text);               
            if (si != 0) MessageBox.Show("Signed in successfully!");
            else MessageBox.Show("Couldn't sign in");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }            
    }
Run Code Online (Sandbox Code Playgroud)

我第一次单击该按钮时效果很好,但是当我再次单击时,出现错误:“InvalidOperationException,尝试将任务转换为已完成的最终状态。”

我做了一些小搜索,在这里找到了一些东西:任务似乎自动启动

我知道我应该在重新开始之前做一些事情来停止这个过程,但我不知道如何以及为什么。有人可以为我解释一下吗?

Fly*_*ast 5

我尝试使用 TrySetResult() 方法而不是 SetResult() 方法,它成功了!