0

service_GetItemInfoCompleted()以下のコードで関数を使用せずに Web サービスを呼び出す方法は? 関数なしで結果を取得できますかservice_GetItemInfoCompleted()

何か案が?

private void btnFind_Click(object sender, RoutedEventArgs e)
{
      Service1Client service = new Service1Client();
      service.GetItemInfoAsync(txt1.Text);
      service.GetItemInfoCompleted += new EventHandler<GetItemInfoCompletedEventArgs>(service_GetItemInfoCompleted);    
}

void service_GetItemInfoCompleted(object sender, GetItemInfoCompletedEventArgs e)
{
      txb1.Text = e.Result;
}

例 2

public void running()
{    
      ServiceReference1.WebServiceSoapClient test = new ServiceReference1.WebServiceSoapClient();

      test.ReadTotalOutstandingInvoiceCompleted += new EventHandler<ServiceReference1.ReadTotalOutstandingInvoiceCompletedEventArgs>(serviceClient);  

      test.ReadTotalOutstandingInvoiceAsync();
}

public void serviceClient(object sender, ReadTotalOutstandingInvoiceCompletedEventArgs e)
{

      answer = int.parse(e.Result.ToString());
}
4

1 に答える 1

0

上記のアプローチが正しいアプローチです。サービスにリクエストを送信し、サービスが戻ってきたら、返されたデータをテキストボックスに表示します。

1回のブロッキング呼び出しで同じ操作を実行した場合..。

private void btnFind_Click(object sender, RoutedEventArgs e)
{
    Service1Client service = new Service1Client();
    txtb1.Text = service.GetItemInfoAsync(txt1.Text);
}

...その後、データがサービスから返されるまで、メインUIスレッドはブロックされます。サービスが戻るまでに数秒かかると、アプリのUIが数秒間断続的に「ハング」し、ユーザーのエクスペリエンスが非常に悪くなります。これは悪いことであり、絶対に避けるべきことです!

そのため、サービスを非同期的に呼び出し、スレッドをブロックせずにサービスが戻るのを待ちます。ただし、非同期コードを手動で記述するのではなく、C#5.0のnew asyncawaitkeywordsを使用して、上記と同じ目標を達成できますが、コードと複雑さは少なくなります。

private async void btnFind_Click(object sender, RoutedEventArgs e)
{
    Service1Client service = new Service1Client();
    string result = await service.GetItemInfoAsync(txt1.Text);
    txtb1.Text = result;
}

上記のコードでasyncのとの使用に注意してください。awaitasyncキーワードは、待機状態によって駆動されるステートマシンをビルドするようにコンパイラーに指示します。各awaitキーワードは、ステートマシンに新しい状態を追加するようにコンパイラーに指示します。service.GetItemInfoAsync()コードが実行されると、awaitコードは、待機中のタスク(この場合)が完了したときに次の操作でピックアップするようにステートマシンを設定します。

HTH。

于 2013-03-11T06:17:50.287 に答える