gpt4 book ai didi

c# - 如何保证异步操作调用的顺序?

转载 作者:行者123 更新时间:2023-11-30 22:48:24 25 4
gpt4 key购买 nike

[这个似乎是一个很长的问题,但我已尽力使其尽可能清楚。请耐心等待并帮助我...]

我写了一个支持异步操作的测试类。该操作只报告 4 个数字:

class AsyncDemoUsingAsyncOperations
{
AsyncOperation asyncOp;
bool isBusy;

void NotifyStarted () {
isBusy = true;
Started (this, new EventArgs ());
}

void NotifyStopped () {
isBusy = false;
Stopped (this, new EventArgs ());
}

public void Start () {
if (isBusy)
throw new InvalidOperationException ("Already working you moron...");

asyncOp = AsyncOperationManager.CreateOperation (null);
ThreadPool.QueueUserWorkItem (new WaitCallback (StartOperation));
}

public event EventHandler Started = delegate { };
public event EventHandler Stopped = delegate { };
public event EventHandler<NewNumberEventArgs> NewNumber = delegate { };

private void StartOperation (object state) {
asyncOp.Post (args => NotifyStarted (), null);

for (int i = 1; i < 5; i++)
asyncOp.Post (args => NewNumber (this, args as NewNumberEventArgs), new NewNumberEventArgs (i));

asyncOp.Post (args => NotifyStopped (), null);
}
}

class NewNumberEventArgs: EventArgs
{
public int Num { get; private set; }

public NewNumberEventArgs (int num) {
Num = num;
}
}

然后我写了2个测试程序;一个作为控制台应用程序,另一个作为 Windows 窗体应用程序。当我重复调用 Start 时,Windows 窗体应用程序按预期工作:

alt text

但控制台应用程序很难确保顺序:

alt text

因为我在处理类库,所以我必须确保我的类库在所有应用程序模型中都能正常工作(尚未在 ASP.NET 应用程序中测试)。所以我有以下问题:

  1. 我已经测试了足够多的时间,它似乎可以正常工作,但是可以假设上面的代码将始终在 Windows 窗体应用程序中工作吗?
  2. 它(订单)在控制台应用程序中无法正常工作的原因是什么?我该如何解决?
  3. 没有多少 ASP.NET 经验。该订单能否在 ASP.NET 应用程序中使用?

[编辑:可以看到测试 stub here如果有帮助的话。]

最佳答案

除非我遗漏了一些东西,否则给出上面的代码我相信没有办法保证执行顺序。我从未使用过 AsyncOperation 和 AsyncOperationManager 类,但我查看了反射器,可以假设 AsyncOperation.Post 使用线程池异步执行给定的代码。

这意味着在您提供的示例中,4 个任务将非常快速地连续同步排队到线程池。然后,线程池将按照 FIFO 顺序(先进先出)使任务出列,但完全有可能在较早的线程完成其工作之前安排较晚的线程之一或较晚的线程中的一个完成。

因此,鉴于您所拥有的,无法按照您想要的方式控制顺序。有很多方法可以做到这一点,MSDN 上的这篇文章是一个不错的地方。

http://msdn.microsoft.com/en-us/magazine/dd419664.aspx

关于c# - 如何保证异步操作调用的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1699290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com