2015-08-27 41 views
2

當我運行下面的代碼(在C#訪問中被問到)時,它沒有輸出任何內容。這個程序爲什麼寫一個空行而不是字符串值?

有人可以解釋這種行爲嗎?

class Program { 
    private static string result; 

    static void Main() { 
    SaySomething(); 
    Console.WriteLine(result); 
    } 

    static async Task<string> SaySomething() { 
    await Task.Delay(5); 
    result = "Hello world!"; 
    return 「Something」; 
    } 
} 

我認爲這種方法應該輸出result,因爲我打電話

Console.WriteLine(result); 

SaySomething()方法調用完成

+8

你不等待'SaySomething'完成。 – juharr

+2

如果您要在代碼中使用它,您應該知道如何等待/異步工作。 https://msdn.microsoft.com/en-us/library/hh191443.aspx – Igor

+0

在執行任務之前,您正在執行'Console.WriteLine(result);'。 – Eser

回答

2

因爲SaySomethingasync這將產生線程的控制給調用者當您在await Task.Delay(5)上點擊並因此在Console.WriteLine(result)之前改變result的值。只需將其更改爲SaySomething().Wait();即可使用。

1

如果你已經給了Task<string>足夠的時間來完成,這個程序會寫一些東西來控制。但是,目前該程序在SaySomething()完成之前存在。

要解決此問題,請確保您等待Task<string>

static void Main() { 
    MainAsync().Wait(); 
} 
private static async Task MainAsync() { 
    var retVal = await SaySomething().ConfigureAwait(false); 
    Console.WriteLine("{0} - {1}", retVal, result); 
} 

注意,目前的版本還忽略了你的異步任務返回的結果。上面的示例將返回值存儲在retVal變量中,並將其與在SaySomething中存儲的result一起打印在靜態變量中。

0

您並不等待SaySomething返回的Task完成。只要await Task.Delay(5)運行SaySomething返回到Main。此時result尚未設置,因此Console.WriteLine prints an empty string. Then your application ends when主要exits and the task started in SaySomething`永遠不會完成。

希望此相反:

class Program { 
    private static string result; 

    static void Main() { 
    SaySomething().Wait(); 
    Console.WriteLine(result); 
    } 

    static async Task<string> SaySomething() { 
    await Task.Delay(5); 
    result = "Hello world!"; 
    return 「Something」; 
    } 
} 

在正常情況下,但是你想,而不是阻止await SaySomething();,但Main不允許是一個異步方法。

1

您的SaySomething()方法是async。在任務完成之前,您的Console.WriteLine(results)正在被調用。你可以做一些事情。

你可以叫你的函數是這樣的:

SaySomething().Wait(); 

或者你可以打破你的進程外是這樣的:

private static string result; 

    static void Main() 
    { 
     CallSaySomething(); 
     Console.WriteLine(result); 
     Console.ReadLine(); 
    } 

    static async Task<string> SaySomething() 
    { 
     await Task.Delay(5); 
     result = "Hello world!"; 
     return "Something"; 
    } 

    static string CallSaySomething() 
    { 
     var task = SaySomething(); 
     task.Wait(); 

     var result = task.Result; 
     return result; 
    } 
+0

如果我替換await Task.Delay(5);等待Thread.Sleep(5);那麼它會寫「Hello world!」。這是我困惑的地步。你能解釋爲什麼這樣嗎? –

+0

@JaganMohanReddy看看這個SO張貼回答你的問題:http://stackoverflow.com/questions/20082221/when-to-use-task-delay-when-to-use-thread-sleep – CodeLikeBeaker

相關問題