2

我们正在开发一个具有业务、数据访问、数据层逻辑的示例 MWC 应用程序。

在核心项目中,我们使用以下代码来使用来自 json 解析的数据。此代码适用于 Xamarin.Android 和 Xamarin.iOS,但对于 Windows Phone,它显示错误,因为“System.Net.WebRequest 不包含 GetResponse 的定义并且没有 GetResponse 的扩展方法...”

我们尝试使用异步方法来使用 WCF Rest 服务 json 数据,但它在调用完成的方法之前返回为 null。

是否可以等待并从完成的方法中获取数据以返回 json 集合?如果没有,请建议如何实现相同的目标。

    public String login<T>(T item) where T : BusinessLayer.Contracts.IBusinessEntity, new()
    {
        var request = HttpWebRequest.Create(url);
        request.ContentType = "application/json";
        request.Method = "get";
        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                var content = reader.ReadToEnd();
                string nss = content.ToString();
                check = nss;
                return nss;
            }
        }
        return Check;
    }

编辑:我已经包含了异步函数的示例代码。

在执行 DownloadStringCompleted 事件之前,它返回空值。我们需要 DownloadStringCompleted 输出字符串进行进一步处理。

注意:我们在 Xamarin 中遵循 Tasky的逻辑

    async Task<string> AccessTheWebAsync(string url)
    {
        var webClient = new WebClient();
        webClient.DownloadStringCompleted += (sender, e) =>
        {
            string data =  (string)e.Result;
            check =  data;
        };
        webClient.DownloadStringAsync(new Uri(url));
        return  check;
    }

    public async Task<string> login<T>(T item) where T : BusinessLayer.Contracts.IBusinessEntity, new()
    {
        return check = await AccessTheWebAsync(item.url); 
    }
4

1 回答 1

1

您的异步代码使用不Task正确。它应该用来TaskCompletionSource完成工作:

Task<string> AccessTheWebAsync(string url)
{
    var source = new TaskCompletionSource<string>();
    var webClient = new WebClient();
    webClient.DownloadStringCompleted += (sender, e) =>
    {
        source.TrySetResult((string)e.Result);
    };
    webClient.DownloadStringAsync(new Uri(url));
    return source.Task;
}

之前,您的函数在事件触发之前返回。使用任务源将其正确包装在任务中并修复此问题。

您还需要连接错误事件并调用TrySetException以完成实施。

于 2013-10-29T12:18:39.613 回答