2011-07-26 15 views
0

スレッドからWebサービスへの非同期要求を作成するにはどうすればよいですか?Webサービスへの非同期要求

+0

Silverlight対応のWCFサービスを使用すると、最初の点に応じてSilverlightが自動的に非同期コードを生成します。サービス上のGetData()メソッドは、使用するクライアント側でGetDataCompletedメソッドとGetDataAsyncメソッドを生成します。 – Midimatt

+0

はい、ユーザーがUIで何か他のことをしようとすると、UIがハングしないように別のスレッドで行う必要があります。 – Joan

+0

すべてのコードは__a__スレッドで実行されますが、UIスレッドではないスレッドで非同期リクエストを作成したいと思っていますか? – AnthonyWJones

答えて

0

ここにはWCFを使用したソリューションがあります。

サービスコードFileService.svc

public class FileService 
{ 
    [OperationContract] 
    public byte[] GetFile(string filename) 
    { 
     byte[] File; 
     //do logic 

     return File; 
    } 
} 

クライアントコード

public int requested_file_count = 5; 
public list<string> filenames; 

public FileServiceClient svc 

//Constructor 
public Example() 
{ 
    svc = new FileServiceClient(); 
} 

Public void GetFiles() 
{ 
    //Initialise the list of names and set the count of files received  
    filenames = new list<string>(5); 
    requested_file_count = filenames.Count; 

    svc.GetFileCompleted += new EventHandler<GetFileCompletedEventArgs>(GetFile_Completed); 

    //Call the Async Method passing it the file name and setting the userstate to 1; 

    svc.GetFileAsync(filenames[0],1); 
} 

void GetFile_Completed(object Sender, GetFileCompletedEventArgs e) 
{ 
    if (e.UserState == requested_file_count) 
    { 
    //All files have been downloaded 
    } 
    else 
    { 
     svc.GetFileAsync(filenames[e.UserState],++e.UserState); 
    } 

    //Do Something with the downloaded file 
    byte[] filedata = e.result; 
} 
+0

私はこのようなことをしています。しかし、私は別のスレッドでそれを行う必要があります – Joan

+0

Webサービスへの非同期要求とデータ構造の更新は、別々のスレッドで行う必要があります。どのようにそれを行うにはどのようなアイデア。 – Joan

+0

私の知る限り、サービスコールは別のスレッドで実行されています。 – Midimatt

1

ここでは説明の無負荷時の短い答えはあります。あなたのClientオブジェクト上のAsyncメソッドを使用すると、UIスレッドで実行されていないことを確認してください呼び出す前に

: -

System.Threading.ThreadPool.QueueUserWorkItem(o => 
{ 
    try 
    { 
     svc.SomeMethodAsync(); 
    } 
    catch (err) 
    { 
     // do something sensible with err 
    } 
}); 

今すぐ対応完了イベントはThreadPoolスレッドではないUIスレッド上で発生します。

関連する問題