C# Xamarin:如何将数据从Xamarin iOS项目的NSUrlSession任务返回到共享项目?

C# Xamarin:如何将数据从Xamarin iOS项目的NSUrlSession任务返回到共享项目?,c#,xamarin,nsurlsession,nsurlsessiondownloadtask,C#,Xamarin,Nsurlsession,Nsurlsessiondownloadtask,我在Xamarin iOS项目中有一门课,比如: public class NetworkUtility : INetworkUtility { public void GetData() { NSUrl url = new NSUrl("https://reqres.in/api/users?page=2"); NSUrlRequest request = new NSUrlRequest(url); NSUrlSession

我在Xamarin iOS项目中有一门课,比如:

public class NetworkUtility : INetworkUtility
{

    public void GetData()
    {

        NSUrl url = new NSUrl("https://reqres.in/api/users?page=2");
        NSUrlRequest request = new NSUrlRequest(url);
        NSUrlSession session = null;
        NSUrlSessionConfiguration myConfig = NSUrlSessionConfiguration.DefaultSessionConfiguration;
        myConfig.MultipathServiceType = NSUrlSessionMultipathServiceType.Handover;
        session = NSUrlSession.FromConfiguration(myConfig);
        NSUrlSessionTask task = session.CreateDataTask(request, (data, response, error) => {
            Console.WriteLine(data);

        });

        task.Resume();
    }
}
我用一些Xaml代码从共享项目中调用它,比如:

DependencyService.Get<INetworkUtility>().GetStringData();
如何将此数据返回给调用者(即,返回到后面的Xaml代码)

如果我将
GetData()
函数的返回类型更改为string或Task,并尝试在lambda表达式中返回,则会出现编译错误

我读到很多论坛都说我需要实现一个NSUrlDelegate来处理响应。我为此尝试了多种变体,但没有成功。请告知


另外,(我认为这是不可能的,也不是正确的方法),但有没有一种方法可以将整个NSUrlSession返回到共享项目,并从共享项目本身调用数据任务方法?

有一个简单的解决方案。在
INetworkUtility
接口中声明
GetData()
方法如下:

Task<string> GetData();
Task<string> dataTask = DependencyService.Get<INetworkUtility>().GetData();
await Task.WhenAny(dataTask, Task.Delay(10000)); // 10.000ms timeout
if(dataTask.IsCompletedSuccessfully) {
    //all good:
    string dataString = dataTask.Result;
}else{
    //we hit the time limit
}

工作得很有魅力。谢谢你的帮助。但是这个例子不起作用:Task dataTask=DependencyService.Get().GetData();它说“无法将类型'string'隐式转换为'System.Threading.Task.Task'。但我想我会计算这一部分。感谢TaskCompletionSource部分。此错误消息表示您没有更改
GetData()
签名到
任务
而不是
字符串
,或者您在该行中使用了
等待
关键字。在本例中,
等待
关键字意味着您不希望
任务
对象返回,该对象保存有关正在进行的任务的信息,而希望“等待”“对于字符串结果,只有当任务完成时,您才希望继续执行。哇..”。。抢手货即使在超时的情况下,我也没有删除“wait”关键字。再次感谢。你真棒!
public Task<string> GetData()
{
    TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
    NSUrl url = new NSUrl("https://reqres.in/api/users?page=2");
    NSUrlRequest request = new NSUrlRequest(url);
    NSUrlSession session = null;
    NSUrlSessionConfiguration myConfig = NSUrlSessionConfiguration.DefaultSessionConfiguration;
    myConfig.MultipathServiceType = NSUrlSessionMultipathServiceType.Handover;
    session = NSUrlSession.FromConfiguration(myConfig);
    NSUrlSessionTask task = session.CreateDataTask(request, (data, response, error) => {
        //Console.WriteLine(data);
        //tell the TaskCompletionSource that we are done here:
        tcs.TrySetResult(data); //assuming data is a string but i guess you can convert it if not
    });

    task.Resume();
    return tcs.Task;
}
public async Task ReceiveDataShared() {
    string yourData = await DependencyService.Get<INetworkUtility>().GetData();
}
Task<string> dataTask = DependencyService.Get<INetworkUtility>().GetData();
await Task.WhenAny(dataTask, Task.Delay(10000)); // 10.000ms timeout
if(dataTask.IsCompletedSuccessfully) {
    //all good:
    string dataString = dataTask.Result;
}else{
    //we hit the time limit
}