2

非同期イベント ハンドラーから取得した文字列を返す必要があります。ハンドラー内に戻ろうとしているかのように、現在これを行うことはできません。ハンドラーはvoidを返すことになっているため、オブジェクトを返すことができないというエラーが表示されます。

これが私のコードです:

    public String Login(String username, String password)
    {
        String returningData = "";
        Dictionary<string, object> parameters = new Dictionary<string, object>();
        parameters.Add("user", username);
        parameters.Add("pass", password);

        PostClient client = new PostClient(parameters);
        client.DownloadStringCompleted += (senders, ex) =>
            {
                if (ex.Error == null)
                {
                    //Process the result...
                    return ex.Result;
                }
                else
                {
                    return "An error occurred. The details of the error: " + ex.Error;
                }
            };
        client.DownloadStringAsync(new Uri("http://www.site.com/sample.php", UriKind.Absolute));
    }

ex.Result/エラーメッセージを正しく返すにはどうすればよいですか?

4

3 に答える 3

1

Task<string>メソッドが文字列ではなくを返すようにすることができます。メソッドは呼び出されたときにすぐに値を返すわけではありません。メソッドを呼び出すと作業が開始され、将来のある時点でタスクが完了する可能性があります。を使用しTaskCompletionSourceて、返されるタスクを作成できます。

public Task<string> Login(String username, String password)
{
    var tcs = new TaskCompletionSource<string>();
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("user", username);
    parameters.Add("pass", password);

    PostClient client = new PostClient(parameters);
    client.DownloadStringCompleted += (senders, ex) =>
    {
        if (ex.Error == null)
        {
            //Process the result...
            tcs.TrySetResult(ex.Result);
        }
        else
        {
            string errorMessage = "An error occurred. The details of the error: " + ex.Error;
            //todo use a more derived exception type
            tcs.TrySetException(new Exception(errorMessage));
        }
    };
    client.DownloadStringAsync(new Uri("http://inkyapps.mobilemp.net/scripts/PHP/socialnet/login.php", UriKind.Absolute));

    return tcs.Task;
}
于 2013-07-22T16:05:21.640 に答える
0

これを にまとめて、次のようTask<string>に返します。

public Task<string> LoginAsync(String username, String password)
{
    var results = new TaskCompletionSource<string>();
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("user", username);
    parameters.Add("pass", password);

    PostClient client = new PostClient(parameters);
    client.DownloadStringCompleted += (senders, ex) =>
        {
            if (ex.Error == null)
            {
                results.TrySetResult(ex.Result);
            }
            else
            {
                results.TrySetException(ex.Error); // Set the exception
            }
        };
    client.DownloadStringAsync(new Uri("http://inkyapps.mobilemp.net/scripts/PHP/socialnet/login.php", UriKind.Absolute));

    return results.Task;
}

asyncこれにより、このメソッドを/キーワードで直接使用できるようになりawait、適切な非同期サポートと呼び出し元での例外処理が提供されます。

于 2013-07-22T16:06:39.833 に答える