मैं निम्नलिखित कोड का प्रयास कर रहा हूं, इसमें दो भाग हैं, एक प्रिज्म के माध्यम से नेविगेशन है। जब नेविगेशन की अनुमति है तो मैं एक गहरा भार अतुल्यकालिक रूप से शुरू कर रहा हूं लेकिन प्रत्येक बार एक नए संदर्भ के साथ। यहाँयूओयू - पिछले एसिंक्रोनस ऑपरेशन से पहले इस संदर्भ पर एक दूसरा ऑपरेशन शुरू हुआ
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);
}
कोई समस्या नहीं: बाद में कोड में मैं नेविगेशन जो इस तरह लोड नहीं कर रहे हैं लेकिन नीचे कोड भी काम नहीं करता है तो रद्द बाद में ;-)
नेविगेशन तर्क के लिए एक मामला है लंबित रद्द करना चाहते हैं
गहरी लोड हो रहा है तर्क:
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;
}
जैसे मैं इंतजार करना भूल गया मैं हो रही अपवाद रखने के लिए, लेकिन इस मामले कभी नहीं है। जब भी मैं जीयूआई थ्रेड पर निरंतरता चाहता हूं तो मैं कॉन्फ़िगरवाइट (सत्य) का भी सही उपयोग करता हूं। लेकिन मैं इस त्रुटि को डीप्लोडिंग तर्क में प्राप्त करता रहता हूं। काम और भंडार वर्गों की इकाई भी एसिंक प्रतीक्षा तंत्र का उपयोग करती है लेकिन वहां भी मैं ठीक से इंतजार कर रहा हूं।
पिछले एसिंक्रोनस ऑपरेशन पूर्ण होने से पहले इस संदर्भ पर एक दूसरा ऑपरेशन शुरू हुआ। यह सुनिश्चित करने के लिए 'प्रतीक्षा करें' का प्रयोग करें कि इस संदर्भ पर किसी अन्य विधि को कॉल करने से पहले किसी भी एसिंक्रोनस ऑपरेशंस पूर्ण हो गए हैं। किसी भी इंस्टेंस सदस्यों को थ्रेड सुरक्षित होने की गारंटी नहीं है।
संपादित (हटाया लकड़हारा कोड कोड के आकार को कम करने के लिए)
कृपया ध्यान दें कि createUnitOfWorkAsync() एक असीमित विधि नहीं है। यह सिर्फ एक वर्ग बनाता है जो एसिंक प्रतीक्षा पैराडाइम का समर्थन करता है। –
'createUnitOfWorkAsync' एक * नया * संदर्भ बनाता है, सही? –
'कॉन्फ़िगरएवाइट (सत्य);' यह पहला टाइमर है .. –