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

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

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

Re[2]: マルチスレッドで発生するエラーについて


(過去ログ 21 を表示中)

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

■9116 / inTopicNo.1)  マルチスレッドで発生するエラーについて
  
□投稿者/ りお (5回)-(2007/10/19(Fri) 11:43:24)

分類:[C#] 

お世話になります。

マルチスレッド化について質問です。

大まかな処理の流れです。
 @Hoko.php
  引数(報告日)を取得します。これはABへの引数を取得するためのスクリプト。
 AAAA.php、BBB.php、CCC.php
  並列処理を行います。
 BXXX.php
  最終処理を行います。

@、A、BすべてPHPのスクリプトです。
これを.NET(C#)からWebサービスとして起動させています。


プログラムを実行するとエラーが発生してしまいます。
(それぞれのPHPを個別で処理させれば正常に動くのですが。。)

どこが原因でエラーになるのか、まるで分からず困っています。

原因や、対策、別の方法での回避策など、アドバイス頂きたいです。
宜しくお願いします。



●●●  ↓はコンソールへの出力結果です。 ●●●

 並列処理終了
 最終処理を開始します

 ハンドルされていない例外: System.Net.WebException: 要求は中止されました: 要求がキャンセルされました
   場所 System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
   場所 System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
   場所 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   場所 testMultiThread.XXX.testService.test(String inputString)
   場所 C:\Documents and Settings\rio\My Documents\Visual Studio 2005\Projects\TEST\testMultiThread\testMultiThread\Web References\XXX\Reference.cs:行 79
   場所 testMultiThread.Threadinfo.tXXX()
   場所 C:\Documents and Settings\rio\My Documents\Visual Studio 2005\Projects\TEST\testMultiThread\testMultiThread\Program.cs:行 421
   場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   場所 System.Threading.ThreadHelper.ThreadStart()
 続行するには何かキーを押してください . . .


●●● ここから下がソースです。 ●●●

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Threading;

namespace testMultiThread
{
    /*
     * マルチスレッドメソッドのためのクラス
     */
    class Threadinfo
    {
        // スレッドが返す値
        public string ReturnValue;

        // スレッドに渡す値
        public string strHokodate;

        // インストラクタ
        public Threadinfo(string hokodate)
        {
            this.strHokodate = hokodate;
        }

        //AAA.php
        public void tAAA()
        {
            //Webサービスのインスタンス
            AAA.testService wsTest = new AAA.testService();
            //Webサービスの呼び出し
            wsTest.test(this.strHokodate);
        }

        //BBB.php
        public void tBBB()
        {
            //Webサービスのインスタンス
            BBB.testService wsTest = new BBB.testService();
            //Webサービスの呼び出し
            wsTest.test(this.strHokodate);
        }

        //CCC.php
        public void tCCC()
        {
            //Webサービスのインスタンス
            CCC.testService wsTest = new CCC.testService();
            //Webサービスの呼び出し
            wsTest.test(this.strHokodate);
        }

        //XXX.php
        public void tXXX()
        {
            //Webサービスのインスタンス
            XXX.testService wsTest = new XXX.testService();
            //Webサービスの呼び出し
            wsTest.test(this.strHokodate);
        }
    }

    class Program
    {
        /*
         * エントリポイント
         */
        public static void Main(string[] args)
        {
            /*
             * Hoko.php スレッドへの引数(報告日)を取得
             */
            string strHokodate;

            // Webサービスのインスタンス
            localhost.Hokodate wsMyService = new localhost.Hokodate();

            // Webサービスの呼び出し
            strHokodate = wsMyService.getHokodate("");

            /*
             * 並列処理
             */
            // スレッドに渡すデータを設定
            Threadinfo info = new Threadinfo(strHokodate);

            Thread tAAA = new Thread(new ThreadStart(info.tAAA));
            Thread tBBB = new Thread(new ThreadStart(info.tBBB));
            Thread tCCC = new Thread(new ThreadStart(info.tCCC));
            tAAA.Start();
            tBBB.Start();
            tCCC.Start();
            tAAA.Join();
            tBBB.Join();
            tCCC.Join();

            Console.WriteLine("並列処理終了");

            /*
             * 最終処理
             */
            Thread tXXX = new Thread(new ThreadStart(info.tXXX));
            tXXX.Start();
            Console.WriteLine("最終処理を開始します");
            tXXX.Join();
            Console.WriteLine("最終処理終了");
        }
    }
}

引用返信 編集キー/
■9120 / inTopicNo.2)  Re[1]: マルチスレッドで発生するエラーについて
□投稿者/ HiJun (74回)-(2007/10/19(Fri) 12:59:34)
No9116 (りお さん) に返信
まず、Exception内容をみていると、スレッド起動時にエラーになっていますが
どのスレッドのスタートでエラーになっているか判断したほうが良いかと思います。

(平行に動いているから、タイミングが重なってしまっているだけのようにも
思えます。)
引用返信 編集キー/
■9237 / inTopicNo.3)  Re[2]: マルチスレッドで発生するエラーについて
□投稿者/ りお (7回)-(2007/10/22(Mon) 16:17:07)
HiJunさん

タイミングですかね…
すべてのphpは共通ファイルをインクルードして利用しています。
なので、マルチスレッドで行うには相応しくないのでしょうか。

上に挙げたプログラムでは、"最終処理を開始します"まではコンソール出力されているので、
tXXX.Start();
を通過し、XXX.phpを起動できたように見えます。
しかし、XXX.phpでもログ出力しているのですが、ログが出ていないので、どこに原因が
あるのか見当がつきません。

なにかお分かりのことがありましたら、アドバイスお願いします。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -