Aşağıdaki kodları izlemeyi deniyorum, iki parçadan oluşuyor, biri prizma yoluyla geziniyor. Gezinmeye izin verildiğinde, derin bir zaman uyumsuz olarak ancak her defasında yeni bir bağlamla başlıyorum.UOW - Bir önceki asenkron işlem tamamlanmadan önce bu bağlamda ikinci bir işlem başlatıldı
public void OnNavigatedTo(NavigationContext navigationContext)
{
int relatieId = (int)navigationContext.Parameters["RelatieId"];
if (_relatie != null && _relatie.RelatieId == relatieId) return;
loadRelatieAsync(relatieId);
}
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
bool navigationAllowed = true;
continuationCallback(navigationAllowed);
}
burada herhangi bir sorun: Daha sonra kodunda Öyle iptal sonra ;-)
navigasyon mantık meselesidir bu yüklemeyi bitirmedi ama aşağıdaki kod bile yaramayan gezinmeleri bekleyen iptal etmek isteyeyim
derin yükleme mantığı: Ben bekliyor unuttum sanki
private async Task loadRelatieAsync(int relatieId)
{
try
{
await Task.Run(async() =>
{
_unitOfWork = _UnitOfWorkFactory.createUnitOfWorkAsync();
IEnumerable<Relatie> relaties = await getRelatieAsync(_unitOfWork, relatieId).ConfigureAwait(true);
_relatieTypeTypes = await getRelatieTypeTypesAsync(_unitOfWork, relatieId).ConfigureAwait(true);
_relatie = relaties.FirstOrDefault();
_unitOfWork.Dispose();
}).ConfigureAwait(true);
processRelatie(_relatie);
processRelatieTypes(_relatie, _relatieTypeTypes);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
throw;
}
}
private async Task<IEnumerable<Relatie>> getRelatieAsync(IUnitOfWorkAsync unitOfWork, int relatieId)
{
IEnumerable<Relatie> relaties = null;
try
{
IRepositoryAsync<Relatie> relatieRepository = unitOfWork.RepositoryAsync<Relatie>();
relaties = await relatieRepository
.Query(r => r.RelatieId == relatieId)
.Include(i => i.BegrafenisOndernemer)
.SelectAsync()
.ConfigureAwait(false);
IRepositoryAsync<Adres> adresRepository = unitOfWork.RepositoryAsync<Adres>();
//exception is thrown after executing following line
var adressen = await adresRepository
.Query(r => r.RelatieId == relatieId)
.Include(i => i.AdresType)
.SelectAsync()
.ConfigureAwait(false);
_relatieTypeRepository = unitOfWork.RepositoryAsync<RelatieType>();
var relatieTypes = await _relatieTypeRepository
.Query(r => r.RelatieId == relatieId)
.SelectAsync()
.ConfigureAwait(false);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);//exception is shown here
throw;
}
return relaties;
}
private async Task<IEnumerable<RelatieTypeType>> getRelatieTypeTypesAsync(IUnitOfWorkAsync unitOfWork, int relatieId)
{
IEnumerable<RelatieTypeType> relatieTypeTypes = null;
try
{
IRepositoryAsync<RelatieTypeType> relatieTypeTypeRepository =
unitOfWork.RepositoryAsync<RelatieTypeType>();
relatieTypeTypes = await relatieTypeTypeRepository
.Query()
.SelectAsync()
.ConfigureAwait(false);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
throw;
}
return relatieTypeTypes;
}
ben alıyorum istisnaları tutmak, ancak bu durum asla. Ayrıca GUI iş parçacığına devam etmek istediğimde configureawait (true) özelliğini de kullanıyorum. Ama bu hatayı deeploading mantığında alıyorum. İş ve depo sınıfları birimi aynı zamanda async bekleme mekanizmasını kullanır, fakat orada da doğru şekilde bekliyorum.
Bir önceki asenkron işlem tamamlanmadan önce bu bağlamda ikinci bir işlem başlatıldı. Bu bağlamda başka bir yöntem aramadan önce tüm zaman uyumsuz işlemlerin tamamlandığından emin olmak için 'bekle' seçeneğini kullanın. Herhangi bir üye üyenin iş parçacığı güvenli olduğu garanti edilmez.
Düzenleme Bu muhtemelen cevap, ancak kodu üzerinde genel bir görünüm
, createUnitOfWorkAsync() öğesinin eşzamansız bir yöntem olmadığını lütfen unutmayın. Sadece async bekleme paradigmasını destekleyen bir sınıf oluşturur. –
'createUnitOfWorkAsync' bir * yeni * bağlamı yaratıyor, doğru mu? –
'ConfigureAwait (true);' Bu ilk zamanlayıcıdır .. –