我正在使用 .NET Framework v4.7.2。我有下面原始代碼的簡化版本。
在我最初的問題中,Form_Load()處理程式過早結束,所以我決定將Form_Load()處理程式中的所有內容都包裝在 a 中Task,然后在Form_Show()處理程式中(在 之后 觸發Form_Load())拉出我異步加載到Task. 我關心的資料是stringArray,這是出來的null。
顯然,我更愿意弄清楚為什么 Form_Load()過早結束,但我沒有運氣。
我知道在這里掙扎,可能缺少一些基本概念。我覺得如果我能理解為什么stringArray是null,我就會理解為什么我的原創會Form_Load()提前結束。該formLoadTask的Status財產是RanToCompletion怎么可能stringArray是null?
請記住,這是真實代碼的簡化版本。
謝謝
interface IRetriever
{
Task<String[]> GetStringArray();
}
class Retriever : IRetriever
{
public async Task<string[]> GetStringArray()
{
return await Task.FromResult(new string[] { "More", "Larry", "Curly", });
}
}
static class Director
{
internal static async Task<IRetriever> CreateRetriever()
{
return await Task<IRetriever>.Factory.StartNew(() =>
{
// Simulate some I/O bound waiting...
Thread.Sleep(5000);
return new Retriever();
});
}
}
public partial class Form1 : Form
{
private static String[] stringArray;
private static IRetriever retriever;
internal Task formLoadTask;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
formLoadTask = Task.Factory.StartNew(async () =>
{
retriever = await Director.CreateRetriever();
stringArray = await retriever.GetStringArray();
});
}
private void Form1_Shown(object sender, EventArgs e)
{
// I know I am tying up the UI thread here. This is just an example.
formLoadTask.Wait();
// At this point the formLoadTask is finished, so shouldn't the stringArray be populated?
// The next line throws a NullReferenceException because stringArray is null.
// Why??
System.Diagnostics.Debug.WriteLine(stringArray.Length);
}
}
uj5u.com熱心網友回復:
StartNew無法識別您的異步委托。它把它當作Func<Task>沒有人最終等待的。您存盤formLoadTask的任務只是啟動任務的任務,而不是任務本身。
您可以打開任務或使用更現代的Task.Run,它可以正確處理異步委托。
formLoadTask = Task.Factory.StartNew(async () =>
{
retriever = await Director.CreateRetriever();
stringArray = await retriever.GetStringArray();
}).Unwrap();
或(首選):
formLoadTask = Task.Run(async () =>
{
retriever = await Director.CreateRetriever();
stringArray = await retriever.GetStringArray();
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/345416.html
