51490


コードここですの部分なのですが。Taskで関数から配列が帰ってきてそれを画面に一つずつ出力したいのですがなぜエラーになるのでしょうか見当がつかないので教えてくれますでしょうか？

[code]

    static async Task<sync_test[]> Thread_class(sync_test[] c,int n,string x)
    {
        if(n == 0)
        {
            return null;
        }
    
        await Task.Run(() => 
        {
    
            for(int i =0; i<n; i++)
            {
                c[i].str = x;
            }
    
        });
    
    
        return c;
    }
    
    static void Main(string[] args)
    {
        string s = "test";
        sync_test[] ss = new sync_test[5] 
        {
            new sync_test(), new sync_test(),
            new sync_test(), new sync_test(),
            new sync_test()
        }; 
    
        int n = ss.Length;
        Task<sync_test[]> s2 = Thread_class(ss,n,s);
    
    
        for(int i=0; i<n; i++)
        {
            s2[i].str;//ココのコード
    
            //Console.WriteLine(s2[i].str);
        }
    
    
        //sync_test sy = new sync_test();
        //int n = sy.Lengt;
    
        Task<sync_test[]> t = Thread_class(ss,n,s);
    
[/code]


CC BY-SA 4.0
2018-12-24T14:40:53.587
51485
2018-12-25T00:56:42.737
2018-12-24T23:46:15.463
2238
question
c#
Task配列の使い方が知りたい。


`s2`は`Task<sync_test[]>`なので配列のタスククラスです。  
タスクに対して直接`s2[i].str`を指定して値を取得することはできません。

なぜならタスクは`<ジェネリック>`クラスの処理状況を監視するクラスとして`Status`や`IsCompleted`などのプロパティが用意されているからです。  
タスクには処理結果を取得する`Result`プロパティも用意されているので、ココのコードを下記のように書き換えるとエラーが解消されます。

[code]

    Console.WriteLine(s2.Result[i].str);
    
[/code]

ところで`Thread_class`というメソッド名は、クラス名と誤解されそうです。  
`RunSyncTests`のように動詞から始まる名称を検討された方がよろしいかと存じます。


CC BY-SA 4.0
2018-12-25T00:56:42.737
51490
2018-12-25T00:56:42.737
9820
51485
answer