Return 使用 async/await 进行请求时多个函数调用的相同值
Return the same value for multiple function calls while a request is ongoing using async/await
给定以下函数:
public async Task<int> GetValue() {
var value = await GetValueFromServer();
return value;
}
我想完成这个。可以从程序的不同部分调用函数 GetValue()。虽然 GetValueFromServer() 是 运行,但我不想再次调用它。当 GetValueFromServer() 为 运行 时,对 GetValue() 的所有调用都应 return 相同的值并且不会发起另一个调用。在 GetValueFromServer() 不是 运行 时调用 GetValue() 应该启动对 GetValueFromServer() 的新调用。
一个例子:
0.0: var a = await GetValue()
0.1: call to GetValueFromServer()
0.3: var b = await GetValue();
0.6: var c = await GetValue();
0.7: GetValueFromServer() returns 1
0.9: var d = await GetValue();
1.0: call to GetValueFromServer()
1.3 GetValueFromServer() returns 2
在 0.0、0.3 和 0.6 处对 GetValue() 的调用应该只会触发对 GetValueFromServer() 的一次调用。所有三个调用者都应该收到相同的值。在 0.9 处对 GetValue() 的调用应触发对 GetValueFromServer() 的另一次调用。
我仍然停留在 Objective-C 思考我将在何处使用块来完成此操作。我会将块排队,当对服务器的请求 returns 调用每个排队的块时。
- (void)getValue:(void(^)(int value))block {
[_runningBlocks addObject:[block copy]];
if (_runningBlocks.count > 1) {
return;
}
[self getValueFromServer:^(int value) {
for (void(^)(int)b in _runningBlocks) {
b(value);
}
[_runningBlocks removeAllObjects];
];
}
现在我想完成同样的事情,但使用 async/await 模式。这是用于 Windows Phone 8.1 (RT) 应用程序,如果可能的话我想避免使用第三方 library/framework。
您需要共享相同的任务才能return相同的值(您需要共享状态)。为此,您需要同步访问。
以下内容应该绰绰有余。
private object padLock = new object();
private Task<int> executingTask;
public async Task<int> GetValue()
{
lock(padLock)
{
if (executingTask == null || executingTask.IsCompleted)
executingTask= GetValueFromServer();
}
var value = await executingTask;
return value;
}
给定以下函数:
public async Task<int> GetValue() {
var value = await GetValueFromServer();
return value;
}
我想完成这个。可以从程序的不同部分调用函数 GetValue()。虽然 GetValueFromServer() 是 运行,但我不想再次调用它。当 GetValueFromServer() 为 运行 时,对 GetValue() 的所有调用都应 return 相同的值并且不会发起另一个调用。在 GetValueFromServer() 不是 运行 时调用 GetValue() 应该启动对 GetValueFromServer() 的新调用。
一个例子:
0.0: var a = await GetValue()
0.1: call to GetValueFromServer()
0.3: var b = await GetValue();
0.6: var c = await GetValue();
0.7: GetValueFromServer() returns 1
0.9: var d = await GetValue();
1.0: call to GetValueFromServer()
1.3 GetValueFromServer() returns 2
在 0.0、0.3 和 0.6 处对 GetValue() 的调用应该只会触发对 GetValueFromServer() 的一次调用。所有三个调用者都应该收到相同的值。在 0.9 处对 GetValue() 的调用应触发对 GetValueFromServer() 的另一次调用。
我仍然停留在 Objective-C 思考我将在何处使用块来完成此操作。我会将块排队,当对服务器的请求 returns 调用每个排队的块时。
- (void)getValue:(void(^)(int value))block {
[_runningBlocks addObject:[block copy]];
if (_runningBlocks.count > 1) {
return;
}
[self getValueFromServer:^(int value) {
for (void(^)(int)b in _runningBlocks) {
b(value);
}
[_runningBlocks removeAllObjects];
];
}
现在我想完成同样的事情,但使用 async/await 模式。这是用于 Windows Phone 8.1 (RT) 应用程序,如果可能的话我想避免使用第三方 library/framework。
您需要共享相同的任务才能return相同的值(您需要共享状态)。为此,您需要同步访问。
以下内容应该绰绰有余。
private object padLock = new object();
private Task<int> executingTask;
public async Task<int> GetValue()
{
lock(padLock)
{
if (executingTask == null || executingTask.IsCompleted)
executingTask= GetValueFromServer();
}
var value = await executingTask;
return value;
}