Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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# 等待异步Web服务调用完成内部任务_C#_Windows Phone 8.1 - Fatal编程技术网

C# 等待异步Web服务调用完成内部任务

C# 等待异步Web服务调用完成内部任务,c#,windows-phone-8.1,C#,Windows Phone 8.1,所以我对Windows Phones和C#有点陌生,所以我知道我在设置上可能是错的,所以也许有人可以给我指出正确的方向。在移动应用程序中,我们需要能够在继续调用其他方法之前调用特定服务以生成会话guid,因此,从我目前所读到的内容来看,听起来我需要将该调用放在任务内部,这样我就可以使用wait方法来防止调用下一项,但我不知道在任务内部如何调用web服务方法并在任务完成之前获得结果。这是我到目前为止所做的,我从各种来源尝试了一些其他的东西,但都不起作用,所以我决定将其还原到我的第一次尝试,然后将其

所以我对Windows Phones和C#有点陌生,所以我知道我在设置上可能是错的,所以也许有人可以给我指出正确的方向。在移动应用程序中,我们需要能够在继续调用其他方法之前调用特定服务以生成会话guid,因此,从我目前所读到的内容来看,听起来我需要将该调用放在任务内部,这样我就可以使用wait方法来防止调用下一项,但我不知道在任务内部如何调用web服务方法并在任务完成之前获得结果。这是我到目前为止所做的,我从各种来源尝试了一些其他的东西,但都不起作用,所以我决定将其还原到我的第一次尝试,然后将其发布到这里寻求帮助

public static async Task<Guid> GetAMSessionGUID()
{
    Debug.WriteLine("setting up client");
    AMClient client = new AMClient();
    Guid session = new Guid();
    client.GetSessionCompleted += delegate(object sender, GetSessionCompletedEventArgs e)
    {
        session = e.Result.session_ID;
        Debug.WriteLine("session completed " + session);
    };
    client.GetSessionAsync();
    return session;
}
public静态异步任务GetAMSessionGUID()
{
Debug.WriteLine(“设置客户端”);
AMClient client=新的AMClient();
Guid会话=新Guid();
client.GetSessionCompleted+=委托(对象发送方,GetSessionCompletedEventArgs e)
{
session=e.Result.session\u ID;
Debug.WriteLine(“会话完成”+会话);
};
client.GetSessionAsync();
返回会议;
}

您应该等待调用的异步方法(通常是以async结尾的方法)

因此,在您提供的方法中,应该
等待client.GetSessionAsync()


然后,您应该等待您自己的方法的调用(按照习惯,您也应该在其名称中添加异步后缀)

什么是
AMClient
类型?如何声明
GetSessionAsync()
方法

根据你问题的性质,我猜测该方法的声明如下:

public void GetSessionAsync()
async Task DoSomeStuff()
{
    // do initial stuff

    Guid sessionGuid = await GetAMSessionGUIDAsync();

    // do some other stuff
}
“async”指的是该方法立即返回,并且在操作实际完成时引发
GetSessionCompleted
事件。如果是这样,那么您可以使用
TaskCompletionSource
类来帮助您为您的方法实现
async
/
wait
友好的包装器。例如:

public static Task<Guid> GetAMSessionGUIDAsync()
{
    Debug.WriteLine("setting up client");
    AMClient client = new AMClient();
    TaskCompletionSource<Guid> completionSource = new TaskCompletionSource<Guid>();

    client.GetSessionCompleted += (sender, e) =>
    {
        Debug.WriteLine("session completed " + session);
        completionSource.SetResult(e.Result.session_ID);
    };
    client.GetSessionAsync();

    return completionSource.Task;
}

只有当
GetSessionAsync()
本身是可等待的,即返回一个
任务时,这才有效。你证实了事实吗?没有!我手腕上挨了一巴掌。如果您不能等待异步结束方法(按原样,或使用ToTask()),那么库可能还有另一种方法:)如果您不能等待,那么您的TaskCompletionSource方法当然是最好的方法!不管是好是坏,
..Async
命名约定早于TPL,因此当然也
Async
/
wait
。因此,我们应该准备好运行许多使用该约定的旧的遗留API,即使它们不适合新的
async
/
wait
模式。人们希望今天新发布的API只对真正的可等待API使用该约定,但即使这样也不能保证,而且考虑到旧的先例,甚至可以说是“好的”(因为发布一个与
async
/
await
不兼容的新异步API可以被认为是好的,IMHO是“不太好的:))我已经编辑了你的标题。请看“,”其中的共识是“不,他们不应该”对不起,约翰,当我在谷歌上搜索答案时,我得到了各种Java和F的答案,因为我需要C,我想我应该在一开始就说清楚。我将确保在以后的标题中避免使用标签。谢谢你,佩特,对不起,我的第一个问题不太清楚。AMClient是一个soapwebservice,我使用addservices选项将其添加到项目中,以创建Web服务的所有类。我现在就试试你的方法,看看是否能满足我的需要。