Вам нужно объявить родительский div как position: relative
или position: absolute
.
relative
is что вы ищете в этом случае.
Посмотрите пример в здесь , у Стивена есть ясный ответ для вас:
Так вот что происходит, начиная с метода верхнего уровня (Button1_Click for UI / MyController.Get для ASP.NET):
- Метод верхнего уровня вызывает GetJsonAsync (в контексте UI / ASP.NET).
- GetJsonAsync запускает REST запрос, вызвав HttpClient.GetStringAsync (все еще в контексте).
- GetStringAsync возвращает незавершенную задачу, указывая, что запрос REST не завершен.
- GetJsonAsync ожидает задачу, возвращенную GetStringAsync. Контекст захвачен и будет использоваться для продолжения использования метода GetJsonAsync позже. GetJsonAsync возвращает незавершенную задачу, указывая, что метод GetJsonAsync не завершен.
- Метод верхнего уровня синхронно блокирует задачу, возвращенную GetJsonAsync. Это блокирует контекстный поток.
- ... В конце концов, запрос REST завершится. Это завершает задачу, которая была возвращена GetStringAsync.
- Продолжение для GetJsonAsync теперь готово к запуску и ожидает, что контекст будет доступен, чтобы он мог выполняться в контексте.
- Тупик. Метод верхнего уровня блокирует поток контекста, ожидая завершения GetJsonAsync, и GetJsonAsync ожидает, что контекст будет бесплатным, чтобы он мог завершить. Для примера пользовательского интерфейса «контекст» представляет собой контекст пользовательского интерфейса; для примера ASP.NET «контекст» представляет собой контекст запроса ASP.NET.
Еще одна ссылка, которую вы должны прочитать:
Я просто возился с этой проблемой снова в проекте MVC.Net. Если вы хотите вызывать методы async из PartialView, вам не разрешается выполнять асинхронную процедуру PartialView. Вы получите исключение, если вы это сделаете.
Итак, в основном простой способ обхода в сценарий, в котором вы хотите вызвать метод async из метода синхронизации, вы можете сделать следующее:
Пример:
public ActionResult DisplayUserInfo(string userName)
{
// trick to prevent deadlocks of calling async method
// and waiting for on a sync UI thread.
var syncContext = SynchronizationContext.Current;
SynchronizationContext.SetSynchronizationContext(null);
// this is the async call, wait for the result (!)
var model = _asyncService.GetUserInfo(Username).Result;
// restore the context
SynchronizationContext.SetSynchronizationContext(syncContext);
return PartialView("_UserInfo", model);
}
Еще один важный момент заключается в том, что вы не должны блокировать задачи и использовать async до конца, чтобы предотвратить взаимоблокировки. Тогда это будет асинхронная, а не синхронная блокировка.
public async Task<ActionResult> ActionAsync()
{
var data = await GetDataAsync();
return View(data);
}
private async Task<string> GetDataAsync()
{
// a very simple async method
var result = await MyWebService.GetDataAsync();
return result.ToString();
}
GetDataAsync().Result;
будет выполняться, когда задача, возвращаемая GetDataAsync()
, завершается, тем временем она блокирует поток пользовательского интерфейса return result.ToString()
]) помещается в очередь потока UI для выполнения GetDataAsync()
, будет завершена, когда будет запущено его очередное продолжение Тупик может быть нарушен предоставленными альтернативами, чтобы избежать Факт 1 или Факт 2.
var data = await GetDataAsync()
, который позволяет потоку пользовательского интерфейса продолжать работать var data = Task.Run(GetDataAsync).Result
, который выведет продолжение в контекст синхронизации потока threadpool. Это позволяет завершить задачу GetDataAsync()
. Это очень хорошо объясняется в статье Стивена Тууба , примерно наполовину вниз, где он использует пример DelayAsync()
.