如何解决这个僵局?
How to solve this deadlock?
我有一个 UWP 应用程序,我试图在其中存储和检索本地文本文件中的一些数据,但无论我如何尝试,应用程序都会陷入僵局。由于需要发生同步的事情,我尝试使用一个任务并等待它完成,但是应用程序锁定了。
我的 UWP 应用程序中有一个名为 "MainPage" 的页面,在它的构造函数中我有以下代码:
var listenkeyViewModel = new ListenkeyViewModel();
listenkeyViewModel.GetKey();
listenkey = listenkeyViewModel.Listenkey;
get 键是这里的问题,因为它调用了 ViewModel 上的一个方法(我创建它是同步的,因为我认为尽快进行同步调用会更好。
public void GetKey()
{
try
{
var listenKeyTask = RetrieveListenKey();
_listenkey = listenKeyTask.Result;
}
catch (Exception e)
{
}
}
public static async Task<string> RetrieveListenKey()
{
try
{
var storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
var listenkeyFile = await storageFolder.GetFileAsync("listenkey.txt");
return await Windows.Storage.FileIO.ReadTextAsync(listenkeyFile);
}
catch (Exception e)
{
throw new Exception("Could not load file");
}
}
我知道是 "async all the way down" 但这里不可能。我无法使原始代码所在的构造函数异步。你应该如何不陷入僵局?没看懂。
将GetKey
转换为async/await
public async Task GetKey() {
try {
var listenKeyTask = RetrieveListenKey();
_listenkey = await listenKeyTask;
} catch (Exception e) {
//...should handle/log error
}
}
将对此的调用从构造函数中移到事件处理程序中。例如页面加载或在页面生命周期早期调用的一些其他事件。
partial class MainPage : Page {
ListenkeyViewModel listenkeyViewModel;
string listenkey;
public MainPage() {
InitializeComponent();
listenkeyViewModel = new ListenkeyViewModel();
// add a handler to be called when the page has been loaded
this.Loaded += OnPageLoaded;
}
async void OnPageLoaded(object sender, RoutedEventArgs e) {
await listenkeyViewModel.GetKey();
listenkey = listenkeyViewModel.Listenkey;
}
// Shown for demonstration purposes only.
// This is typically autogenerated by Visual Studio.
private void InitializeComponent() {
}
}
async void
允许在事件处理程序上使用,因此这应该允许进程在没有死锁的情况下流动。
我有一个 UWP 应用程序,我试图在其中存储和检索本地文本文件中的一些数据,但无论我如何尝试,应用程序都会陷入僵局。由于需要发生同步的事情,我尝试使用一个任务并等待它完成,但是应用程序锁定了。
我的 UWP 应用程序中有一个名为 "MainPage" 的页面,在它的构造函数中我有以下代码:
var listenkeyViewModel = new ListenkeyViewModel();
listenkeyViewModel.GetKey();
listenkey = listenkeyViewModel.Listenkey;
get 键是这里的问题,因为它调用了 ViewModel 上的一个方法(我创建它是同步的,因为我认为尽快进行同步调用会更好。
public void GetKey()
{
try
{
var listenKeyTask = RetrieveListenKey();
_listenkey = listenKeyTask.Result;
}
catch (Exception e)
{
}
}
public static async Task<string> RetrieveListenKey()
{
try
{
var storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
var listenkeyFile = await storageFolder.GetFileAsync("listenkey.txt");
return await Windows.Storage.FileIO.ReadTextAsync(listenkeyFile);
}
catch (Exception e)
{
throw new Exception("Could not load file");
}
}
我知道是 "async all the way down" 但这里不可能。我无法使原始代码所在的构造函数异步。你应该如何不陷入僵局?没看懂。
将GetKey
转换为async/await
public async Task GetKey() {
try {
var listenKeyTask = RetrieveListenKey();
_listenkey = await listenKeyTask;
} catch (Exception e) {
//...should handle/log error
}
}
将对此的调用从构造函数中移到事件处理程序中。例如页面加载或在页面生命周期早期调用的一些其他事件。
partial class MainPage : Page {
ListenkeyViewModel listenkeyViewModel;
string listenkey;
public MainPage() {
InitializeComponent();
listenkeyViewModel = new ListenkeyViewModel();
// add a handler to be called when the page has been loaded
this.Loaded += OnPageLoaded;
}
async void OnPageLoaded(object sender, RoutedEventArgs e) {
await listenkeyViewModel.GetKey();
listenkey = listenkeyViewModel.Listenkey;
}
// Shown for demonstration purposes only.
// This is typically autogenerated by Visual Studio.
private void InitializeComponent() {
}
}
async void
允许在事件处理程序上使用,因此这应该允许进程在没有死锁的情况下流动。