我有一些代码,我注意到它会让我的应用程序冻结。我正在寻找一种比我更好的解决方案。
如何等待我收到的时候我不知道的值,在得到它们之前我无法继续,只有我想到的解决方案才会使用,直到我收到这些值。
我正在寻找更好的解决方案。如果它不会冻结我的应用程序是最好的。有人告诉我,我应该使用事件,但我无法弄清楚如何做到这一点。
IsBusy = true;
do
{
if (IsBusy)
{
//waiting for values which i don't know when i receive
//i can receive those values in 1sec and also in 2 min
if done -> IsBusy = false;
}
Thread.Sleep(2000);
} while (IsBusy);
IsBusy = true;
do
{
if (IsBusy)
{
//waiting for similar thing until i receive it
if done -> IsBusy = false;
}
Thread.Sleep(5000);
} while (IsBusy);
答案 0 :(得分:1)
我认为使用异步等待的最佳方法。在C#中,使用异步等待进行异步编程非常容易。代码看起来像是同步的。
private async void StartButtonClick(object sender, RoutedEventArgs e)
{
// Starting new task, function stops
// the rest of the function is set to cont
// UI not blocked
Task.Run(async () =>
{
var MyValue = await doSomethingAsync();
}); //there you waiting value
//continue code
}
答案 1 :(得分:1)
可能有几种可能性,虽然你所等待的描述很模糊,但我们可能无法指出你的具体方向。可能有用的一些事情是:
还有其他方法可以多线程化你的代码(这样你在等待时就不会“冻结”),但这些可能是你做所需的更简单的起点。
Async / await 可能会为您工作,但我发现当您已经有一个现有的doSomethingAsync()
类型方法可以使用它们时它们最有用(例如.NET生成的代理中的异步Web / WCF服务方法)。但是,如果所有代码都是您自己的,并且您尝试从头开始多线程,那么它们将不是您用来开始的中心机制。 (当然,如果事实证明 正在等待内置...Async()
方法(如Web服务调用)的某些内容,请务必使用async
/ {{1 ,请选择@Astemir-Almov作为接受的答案!)