我正在用 C# 编写一个 .Net 控制台应用程序。
我需要将基于事件的线程调用转换为异步方法。
例如 :
public class WorkerClass
{
public EventHandler Progress;
public EventHandler Finished;
public void DoSomething()
{
Thread td = new Thread(Start);
td.Name = "Worker Thread";
td.Start();
}
private void Start()
{
int i = 0;
while (i < 10)
{
Thread.Sleep(1000);
i++;
var progress = i * 10;
Progress?.Invoke((object)progress, null);
}
Finished?.Invoke(null, null);
}
}
Class MyMainClass
{
private static WorkerClass myWorkerClass;
static void Main(string[] args)
{
myWorkerClass = new WorkerClass();
RunAsynchronously(null);
}
private async void RunAsynchronously(EventHandler progress)
{
//Main Thread Call
await DoSomethingAsync(progress);
//Resume after worker finished is not in main thread? :(
//Needed main thread to continue
}
private Task<int> DoSomethingAsync(EventHandler progress)
{
var completionSource = new TaskCompletionSource<int>();
EventHandler Progress = null;
EventHandler Finished = null;
Finished = (o, e) =>
{
myWorkerClass.Finished -= Finished;
myWorkerClass.Progress -= Progress;
completionSource.SetResult(100);
};
Progress = (o, e) => { progress?.Invoke(o, e); };
myWorkerClass.Finished += Finished;
myWorkerClass.Progress += Progress;
myWorkerClass.DoSomething();
return completionSource.Task;
}
}
由于某些限制,我需要主线程继续,但是在等待恢复 RunAsynchronously 方法后,当前线程与主线程(或调用等待的线程)不同。
我知道如果调用者是 UI 线程,这种行为会自动起作用,但在我的情况下,它是控制台应用程序并且我没有 UI。
请提出解决方案。提前致谢。