异步等待方法卡住
Async await method gets stuck
我有一个带有此签名的 API 方法:
public Task<MResponse> StartAsync(MRequest request)
我无法更改(我可以更改内部实现但不能更改方法的签名)。
我是这样调用这个方法的:
var ret = await _SyncClient.StartAsync(Request);
这是实现
public Task<MResponse> StartAsync(MRequest request)
{
if (request.Number == 1)
{
return new Task<MResponse>(() => new MResponse() { Description = "Error", Code = 1 });
}
else
{
return new Task<MResponse>(() => new MResponse() { Description = "", Code = 0 });
}
}
在调试模式下,我看到我的代码进入 StartAsync
和 return 并完成它,但看起来等待永远不会结束....
我不知道它会是什么。
如果您需要有关我的代码的更多信息,请告诉我。
看起来您实际上并没有在实现中执行任何异步操作。没关系,总是存在设置签名(即接口)而某些实现不需要它的情况。
您仍然可以使方法 async
和响应 return 就好像它是同步方法一样,如下所示:
public async Task<MResponse> StartAsync(MRequest request)
{
return new MResponse() { ... }
}
但这可能会触发 Intellisense 告诉您在您的方法中没有任何等待。更好的方法是像这样使用 Task.FromResult
:
public Task<MResponse> StartAsync(MRequest request)
{
return Task.FromResult(new MResponse() ... );
}
这将 return 一个已经完成的任务,因此不会阻止您在 follow-up 中的 await
。
您正在通过调用 Task Constructor
创建任务
这会创建一个 Task
,但不会启动它。您必须显式调用 Task.Start
public Task<MResponse> StartAsync(MRequest request)
{
var task = (request.Number == 1)
? new Task<MResponse>(() => new MResponse() { Description = "Error", Code = 1 })
: new Task<MResponse>(() => new MResponse() { Description = "", Code = 0 });
task.Start();
}
您在这里还有其他选择。您可以在当前线程上创建对象并将其 return 作为已完成的任务
return Task.FromResult<MResponse>(new MResponse(...))
另一种选择是调用 Task.Run 在后台线程上启动工作。
public Task<MResponse> StartAsync(MRequest request)
{
Func<MResponse> generateResponse = (request.Number == 1)
? () => new MResponse() { Description = "Error", Code = 1 })
: () => new MResponse() { Description = "", Code = 0 });
return Task.Run(generateResponse);
}
我有一个带有此签名的 API 方法:
public Task<MResponse> StartAsync(MRequest request)
我无法更改(我可以更改内部实现但不能更改方法的签名)。
我是这样调用这个方法的:
var ret = await _SyncClient.StartAsync(Request);
这是实现
public Task<MResponse> StartAsync(MRequest request)
{
if (request.Number == 1)
{
return new Task<MResponse>(() => new MResponse() { Description = "Error", Code = 1 });
}
else
{
return new Task<MResponse>(() => new MResponse() { Description = "", Code = 0 });
}
}
在调试模式下,我看到我的代码进入 StartAsync
和 return 并完成它,但看起来等待永远不会结束....
我不知道它会是什么。
如果您需要有关我的代码的更多信息,请告诉我。
看起来您实际上并没有在实现中执行任何异步操作。没关系,总是存在设置签名(即接口)而某些实现不需要它的情况。
您仍然可以使方法 async
和响应 return 就好像它是同步方法一样,如下所示:
public async Task<MResponse> StartAsync(MRequest request)
{
return new MResponse() { ... }
}
但这可能会触发 Intellisense 告诉您在您的方法中没有任何等待。更好的方法是像这样使用 Task.FromResult
:
public Task<MResponse> StartAsync(MRequest request)
{
return Task.FromResult(new MResponse() ... );
}
这将 return 一个已经完成的任务,因此不会阻止您在 follow-up 中的 await
。
您正在通过调用 Task Constructor
创建任务这会创建一个 Task
,但不会启动它。您必须显式调用 Task.Start
public Task<MResponse> StartAsync(MRequest request)
{
var task = (request.Number == 1)
? new Task<MResponse>(() => new MResponse() { Description = "Error", Code = 1 })
: new Task<MResponse>(() => new MResponse() { Description = "", Code = 0 });
task.Start();
}
您在这里还有其他选择。您可以在当前线程上创建对象并将其 return 作为已完成的任务
return Task.FromResult<MResponse>(new MResponse(...))
另一种选择是调用 Task.Run 在后台线程上启动工作。
public Task<MResponse> StartAsync(MRequest request)
{
Func<MResponse> generateResponse = (request.Number == 1)
? () => new MResponse() { Description = "Error", Code = 1 })
: () => new MResponse() { Description = "", Code = 0 });
return Task.Run(generateResponse);
}