C# 异步如何检测返回时不应继续?

C# 异步如何检测返回时不应继续?,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,在等待异步时,用户可能会更改应用程序的状态。我们怎么处理呢?例如,当异步方法编辑图像时,用户裁剪图像。这不仅与async关键字有关,还与任何第二个任务有关 设置标志似乎既不切实际又容易出错 那我们怎么处理呢?(当然不仅仅是上面的示例。)在您的示例中,在后台操作(假设它是某种增强)完成之前,允许进一步的图像编辑操作是没有意义的。裁剪必须根据增强的结果进行,因为在背景处理完成之前,他们想要改变的图像数据不存在 因此,从用户界面的角度来看,您绝对会使用一个标志,但是您只需要一个。如果正在进行任何操作,

在等待异步时,用户可能会更改应用程序的状态。我们怎么处理呢?例如,当异步方法编辑图像时,用户裁剪图像。这不仅与async关键字有关,还与任何第二个任务有关

设置标志似乎既不切实际又容易出错


那我们怎么处理呢?(当然不仅仅是上面的示例。)

在您的示例中,在后台操作(假设它是某种增强)完成之前,允许进一步的图像编辑操作是没有意义的。裁剪必须根据增强的结果进行,因为在背景处理完成之前,他们想要改变的图像数据不存在


因此,从用户界面的角度来看,您绝对会使用一个标志,但是您只需要一个。如果正在进行任何操作,则不允许用户开始其他操作。他们可以准备好工具、缩放或其他操作,但不能改变图像。

在您的示例中,在后台操作(假设是某种增强)完成之前,允许进一步的图像编辑操作是没有意义的。裁剪必须根据增强的结果进行,因为在背景处理完成之前,他们想要改变的图像数据不存在

因此,从用户界面的角度来看,您绝对会使用一个标志,但是您只需要一个。如果正在进行任何操作,则不允许用户开始其他操作。他们可以准备好工具、缩放或其他任何东西,但不能改变图像

在等待异步时,用户可能会更改应用程序的状态。我们怎么处理呢

有几种方法

您可以防止用户在进行另一个操作时启动另一个操作。一种常见的方法是禁用某些UI元素,这样就不可能启动第二个UI元素

您可以对用户操作进行排队

您可以使用停止(尝试)任何正在进行的异步操作

您可以使用“异步标记”,它只是操作创建和保存的一个简单值(如
new object()
),然后在应用其结果之前在操作结束时进行双重检查-如果标记已更改,则它知道其结果已过时

在等待异步时,用户可能会更改应用程序的状态。我们怎么处理呢

有几种方法

您可以防止用户在进行另一个操作时启动另一个操作。一种常见的方法是禁用某些UI元素,这样就不可能启动第二个UI元素

您可以对用户操作进行排队

您可以使用停止(尝试)任何正在进行的异步操作



您可以使用“异步标记”,它只是操作创建和保存的一个简单值(如
new object()
),然后在应用其结果之前在操作结束时进行双重检查-如果标记已更改,则它知道其结果已过时。

谢谢。但这很快就会变得非常复杂-缩放很好,因此可以更改视图,等等-一半的选项可以,一半不可以。我将不得不为作物设置一个标志,改变亮度,粘贴,。。。或者想象一个像Visual Studio这样的复杂应用程序-一些操作会干扰其他操作,但这些操作不会干扰其他操作…@ispiro,是的,编程很难。好的。也许我想得太多了,设置标志也不会像我想象的那样一团糟……在发布我的评论后,我看到了你的第二个评论+1评论!:)(以及答案)您只需要一个标志:后台操作正在进行吗?如果是这样,就不要再开始了。谢谢。但这很快就会变得非常复杂-缩放很好,因此可以更改视图,等等-一半的选项可以,一半不可以。我将不得不为作物设置一个标志,改变亮度,粘贴,。。。或者想象一个像Visual Studio这样的复杂应用程序-一些操作会干扰其他操作,但这些操作不会干扰其他操作…@ispiro,是的,编程很难。好的。也许我想得太多了,设置标志也不会像我想象的那样一团糟……在发布我的评论后,我看到了你的第二个评论+1评论!:)(以及答案)您只需要一个标志:后台操作正在进行吗?如果是这样,就不要再开始另一个。这是异步处理最困难的部分:严格定义哪些操作可以与其他操作一起运行。我使用设置标志并调用UILogic()方法,该方法在异步调用前后启用/禁用UI项。我希望有一个系统能把它整理好。不幸的是,所有的
async/await
示例都是fire-and-forget样式(看起来简短而酷)。这是异步处理最困难的部分:严格定义哪些操作可以与其他操作一起运行。我使用设置标志并调用UILogic()方法,该方法在异步调用前后启用/禁用UI项。我希望有一个系统能把它整理好。不幸的是,所有的
async/await
示例都是fire-and-forget样式(看起来又短又酷),谢谢。我不太理解最后一个(“异步标记”)。你这是什么意思?@ispiro:启动异步操作时,创建一个
新对象()
,将其保存到一个私有字段,并将其传递给操作。操作完成后,它将对照私有字段中的标记检查其标记;如果它们不匹配,它就知道它过时了。谢谢。知道了。好主意,谢谢。我不太理解最后一个(“异步标记”)。你这是什么意思?@ispiro:启动异步操作时,创建一个
新对象()
,将其保存到一个私有字段,并将其传递给操作。操作完成后,它将对照私有字段中的标记检查其标记;如果他们不匹配,它就会知道