C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: TPLで引数を持たせたデリゲートを使うには


(過去ログ 92 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■54984 / inTopicNo.1)  TPLで引数を持たせたデリゲートを使うには
  
□投稿者/ orange (1回)-(2010/11/12(Fri) 17:41:10)

分類:[C#] 

お世話になっております.
.Net Framework 4.0のTPLに関する質問です.

TPLでタスクの並列を実現するには

引数無しのメソッドを並列で処理する場合,以下のソースでできると思っているんですが,

Action delProcess1 = Process1;//public void Process1(){};
Task[] tasks = new Task[posterlist.Count];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = new Task(delProcess1);
}

引数がある処理を並列で処理したい場合はどうしたらいいのでしょうか?
デリゲートはActionしか指定できないのでしょうか?
Action(T)とか,Action(T1,T2)は使えないのでしょうか?

アドバイスよろしくお願いします!!




引用返信 編集キー/
■54985 / inTopicNo.2)  Re[1]: TPLで引数を持たせたデリゲートを使うには
□投稿者/ aetos (344回)-(2010/11/12(Fri) 17:50:50)
No54984 (orange さん) に返信
> お世話になっております.
> .Net Framework 4.0のTPLに関する質問です.
>
> TPLでタスクの並列を実現するには
>
> 引数無しのメソッドを並列で処理する場合,以下のソースでできると思っているんですが,
>
> Action delProcess1 = Process1;//public void Process1(){};
> Task[] tasks = new Task[posterlist.Count];
> for (int i = 0; i < tasks.Length; i++)
> {
> tasks[i] = new Task(delProcess1);
> }
>
> 引数がある処理を並列で処理したい場合はどうしたらいいのでしょうか?
> デリゲートはActionしか指定できないのでしょうか?
> Action(T)とか,Action(T1,T2)は使えないのでしょうか?
>
> アドバイスよろしくお願いします!!

これ使えばいいんじゃないですか?
http://msdn.microsoft.com/ja-jp/library/dd235693.aspx
引用返信 編集キー/
■54986 / inTopicNo.3)  Re[2]: TPLで引数を持たせたデリゲートを使うには
□投稿者/ orange (2回)-(2010/11/12(Fri) 17:57:44)
aetosさん,回答ありがとうございます.

コンストラクタであったんですね....
インテリセンスで出なかったので気がつきませんでした.

ところで,2つの引数の「Object state」って何ですか?
よければ,教えてください!!
引用返信 編集キー/
■54987 / inTopicNo.4)  Re[3]: TPLで引数を持たせたデリゲートを使うには
□投稿者/ orange (4回)-(2010/11/12(Fri) 18:15:30)
さきほど,教えていただいたコンストラクタを使って,ソースを書き直したんですが,コンパイルが通りません.

//public void Process1(int i){};
Action<int> delProcess1 = Process1;

Task[] tasks = new Task[10];
for (int i = 0; i < tasks.Length; i++)
{
System.Object s = new System.Object();
tasks[i] = new Task(delProcess1(0),s);
}

使い方が間違っていますか?
アドバイスよろしくお願いします.
引用返信 編集キー/
■54989 / inTopicNo.5)  Re[4]: TPLで引数を持たせたデリゲートを使うには
□投稿者/ aetos (345回)-(2010/11/12(Fri) 19:34:02)
No54987 (orange さん) に返信
> さきほど,教えていただいたコンストラクタを使って,ソースを書き直したんですが,コンパイルが通りません.
>
> 使い方が間違っていますか?
> アドバイスよろしくお願いします.

Task のコンストラクタには delProcess1 自体を渡す必要があります。

> tasks[i] = new Task(delProcess1(0),s);

これでは、delProcess1 に引数 0 を与えて呼び出した結果を渡そうとしていることになりますが、戻り値はないのでエラーになります。
delProcess1 に 0 を渡したいのなら

> tasks[i] = new Task(delProcess1, 0);

とする必要があるでしょう。

引用返信 編集キー/
■54990 / inTopicNo.6)  Re[5]: TPLで引数を持たせたデリゲートを使うには
□投稿者/ orange (5回)-(2010/11/12(Fri) 20:10:33)
aetosさん 回答ありがとうございます!!

第1引数にはデリゲートを指定して,
第2引数にはそのデリゲートに渡す引数を指定するんですね.

以下のように,ソースを修正したのですが,

//public void Process1(int i){};
Action<int> delProcess1 = this.Process1;

Task[] tasks = new Task[posterlist.Count];
for (int i = 0; i < tasks.Length; i++)
{
  tasks[i] = new Task(delProcess1, 0);
}

コンパイルエラーが出てしまいます.
エラー内容を見る限り,教えていただいたコンストラクタと違うコンストラクタが呼ばれているようなのですが....

何度も申し訳ないのですが,教えていただけないでしょうか?

以下,エラー内容
=============================================================
(エラー1)
'System.Threading.Tasks.Task.Task(System.Action, System.Threading.CancellationToken)' に最も適している
オーバーロード メソッドには無効な引数がいくつか含まれています。

(エラー2)
引数 1:
'System.Action<int>'から'System.Action' に変換できません

(エラー3)
引数 2:
'int'から'System.Threading.CancellationToken' に変換できません
=============================================================




引用返信 編集キー/
■54991 / inTopicNo.7)  Re[6]: TPLで引数を持たせたデリゲートを使うには
□投稿者/ aetos (346回)-(2010/11/12(Fri) 20:37:45)
No54990 (orange さん) に返信

> 何度も申し訳ないのですが,教えていただけないでしょうか?

Action<int> を Action<object> に代入することはできません。
# 俺もいま試してみるまで知りませんでした。
# Action<参照型> は Action<object> と互換性がありますが、Action<値型> は互換性がないんですね。
引用返信 編集キー/
■55000 / inTopicNo.8)  Re[7]: TPLで引数を持たせたデリゲートを使うには
□投稿者/ orange (6回)-(2010/11/12(Fri) 23:30:54)
回答ありがとうございます!!

>Action<参照型> は Action<object> と互換性がありますが、Action<値型> は互換性がないんですね。
先ほどのソースコードを値型intではなく,参照型のstringに変えてみたんですが,相変わらず,同じエラーが出ます.
因みに,独自で作成したObject型を継承するクラスでもダメでした....

何が原因なのでしょうか?

//public void Process1(string s){};
Action<string> delProcess1 = this.Process1;

Task[] tasks = new Task[posterlist.Count];
for (int i = 0; i < tasks.Length; i++)
{
  tasks[i] = new Task(delProcess1, "abc");
}
引用返信 編集キー/
■55036 / inTopicNo.9)  Re[8]: TPLで引数を持たせたデリゲートを使うには
□投稿者/ orange (7回)-(2010/11/15(Mon) 14:27:51)
aetosさん,回答ありがとうございました!!
引用返信 編集キー/
■55105 / inTopicNo.10)  Re[9]: TPLで引数を持たせたデリゲートを使うには
□投稿者/ orange (9回)-(2010/11/17(Wed) 04:09:08)
別の掲示板で回答を得ることができましたので,リンクを張っておきます.
http://social.msdn.microsoft.com/Forums/ja-JP/netfxgeneralja/thread/77a26c8b-141a-42b4-8801-a02f4eef8a33?prof=required
引用返信 編集キー/
■55106 / inTopicNo.11)  Re[10]: TPLで引数を持たせたデリゲートを使うには
□投稿者/ orange (10回)-(2010/11/17(Wed) 04:10:13)
すみません,解決のところににチェック忘れてました.
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -