通过异步方法

时间:2015-07-27 19:16:29

标签: c#

编辑:我知道这是错误的代码,这就是我用anti-pattern标记它的原因。

好的,这是我今天发现的一些实际的真实代码:

public class ServiceWrapper
{
    bool thingIsDone = false; //class variable.
    //a bunch of other state variables

    public string InvokeSoap(methodArgs args)
    {
        //blah blah blah
        soapClient client = new Client();
        client.doThingCompleted += new doThingEventHandler(MycompletionMethod);
        client.doThingAsync(args);

        do
        {
            string busyWork = "";
        }
        while (thingIsDone == false)

        //do some more stuff
    }

    private void MyCompletionMethod(object sender, completedEventArgs e)
    {
        //do some other stuff
        thingIsDone = true;
    }
}

好的,所以我明白为什么这很糟糕。但实际上让我问这个问题的是thingIsDone true方法InvokeSoap似乎永远不会MyCompletionMethod,即使Thread.Sleep(100)中设置为true,但只有{em>在发布中得到遵守。它的行为与调试模式中的“期望”相同。

while循环中添加l=re.sub(' ', '', l) 也可以修复它。怎么了?

2 个答案:

答案 0 :(得分:4)

CPU可以缓存thingIsDone的值,因为该线程无法在读取之间进行更改。

您需要volatile强制发布写入,以便其他线程可以读取它。

答案 1 :(得分:0)

您可以在循环中使用Thread.Yield()

do
{
    string busyWork = "";
    Thread.Yield();
}
while (thingIsDone == false)