Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在异步事件处理程序中返回字符串_C#_.net_Event Handling_Windows Phone 8 - Fatal编程技术网

C# 在异步事件处理程序中返回字符串

C# 在异步事件处理程序中返回字符串,c#,.net,event-handling,windows-phone-8,C#,.net,Event Handling,Windows Phone 8,我需要返回从异步事件处理程序获取的字符串。我现在不能像在处理程序内部返回一样执行此操作,它会给我一个错误,告诉我我不能返回任何对象,因为处理程序应该返回void 这是我的密码: public String Login(String username, String password) { String returningData = ""; Dictionary<string, object> parameters = new Dict

我需要返回从异步事件处理程序获取的字符串。我现在不能像在处理程序内部返回一样执行此操作,它会给我一个错误,告诉我我不能返回任何对象,因为处理程序应该返回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));
    }
公共字符串登录(字符串用户名、字符串密码)
{
字符串returningData=“”;
字典参数=新字典();
参数。添加(“用户”,用户名);
参数。添加(“通过”,密码);
PostClient客户端=新的PostClient(参数);
client.DownloadStringCompleted+=(发件人,ex)=>
{
如果(例如错误==null)
{
//处理结果。。。
返回结果;
}
其他的
{
return“发生错误。错误的详细信息:”+ex.error;
}
};
client.DownloadStringAsync(新Uri(“http://www.site.com/sample.php“,UriKind.Absolute”);
}

如何正确返回ex.Result/error消息?

只需触发一个事件,通知“外部世界”操作已完成

为此,请定义您的委托:

public void delegate OnError(object sender, string message);
public event OnError OnErrorEvent; 

...



           client.DownloadStringCompleted += (senders, ex) =>
            {
                if (ex.Error == null)
                {
                    //Process the result...
                    return ex.Result;
                }
                else
                {
                   if(OnErrorEvent != null)
                   OnErrorEvent(this, "An error occurred. The details of the error: " + ex.Error;);
                }
            };

这只是一个例子,您必须根据具体情况选择更合适的委托签名。

您可以让方法返回一个
任务,而不是字符串。方法在被调用时不会正确返回值,调用该方法将开始工作,并且任务可以在将来的某个时间点完成。您可以使用
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;
}
公共任务登录(字符串用户名、字符串密码)
{
var tcs=new TaskCompletionSource();
字典参数=新字典();
参数。添加(“用户”,用户名);
参数。添加(“通过”,密码);
PostClient客户端=新的PostClient(参数);
client.DownloadStringCompleted+=(发件人,ex)=>
{
如果(例如错误==null)
{
//处理结果。。。
tcs.TrySetResult(exresult);
}
其他的
{
string errorMessage=“发生错误。错误的详细信息:”+ex.error;
//todo使用更派生的异常类型
tcs.TrySetException(新异常(errorMessage));
}
};
client.DownloadStringAsync(新Uri(“http://inkyapps.mobilemp.net/scripts/PHP/socialnet/login.php“,UriKind.Absolute”);
返回tcs.Task;
}

我将把它包装成一个
任务
,并返回:

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;
}
public Task LoginAsync(字符串用户名、字符串密码)
{
var results=new TaskCompletionSource();
字典参数=新字典();
参数。添加(“用户”,用户名);
参数。添加(“通过”,密码);
PostClient客户端=新的PostClient(参数);
client.DownloadStringCompleted+=(发件人,ex)=>
{
如果(例如错误==null)
{
结果:TrySetResult(exresult);
}
其他的
{
results.TrySetException(ex.Error);//设置异常
}
};
client.DownloadStringAsync(新Uri(“http://inkyapps.mobilemp.net/scripts/PHP/socialnet/login.php“,UriKind.Absolute”);
返回结果。任务;
}

这将允许您直接将此方法与
async
/
wait
关键字一起使用,从而在调用者中提供适当的异步支持和异常处理。

Hmm。。。好主意!我不知道为什么我以前不能想到这一点。您需要两个事件,一个用于错误案例,一个用于成功案例,或者一个具有足够信息的事件通过其参数来处理这两种情况Windows Phone 8是否支持任务类?System.Threading.Tasks不存在…@AndrewKim它应该存在,是的,但我不是winphone开发人员,所以我不确定它有什么不同。