【发布时间】:2009-11-09 05:51:34
【问题描述】:
[这似乎是一个冗长的问题,但我已尽力使其尽可能清楚。请耐心等待并帮助我...]
我编写了一个支持异步操作的测试类。该操作只报告 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 窗体应用程序按预期工作:
但是控制台应用程序很难确保顺序:
由于我正在研究类库,我必须确保我的库在所有应用模型中都能正常工作(尚未在 ASP.NET 应用中测试)。所以我有以下问题:
- 我已经测试了足够多的时间,它似乎可以正常工作,但可以假设上述代码将始终在 Windows 窗体应用程序中工作吗?
- 它(订单)在控制台应用程序中无法正常工作的原因是什么?我该如何解决?
- 没有太多的 ASP.NET 经验。订单可以在 ASP.NET 应用程序中使用吗?
[编辑:如果有帮助,可以看到测试存根here。]
【问题讨论】:
-
输出值后是否可以像刷新 StdIO(在异步“子”中)一样简单?
-
@lexu:无法真正理解您的评论。你能用代码详细说明吗? (我附上了控制台和表单测试存根,如果你愿意看到它们)
-
抱歉,没有代码。我已经看到异步/多线程中的输出表现得像你描述的那样,当客户端没有被强制立即刷新它的输出缓冲区时。您的 GUI 会对“信号/事件”接收做出反应,但来自客户端的控制台输出可能会延迟一小部分,从而使其他进程有机会首先写入控制台。 (这可以通过输出高分辨率计时器和计数器 1..4 来“调试/可视化”。但是,这是一个有根据的猜测..
标签: c# asynchronous