0

これはかなり簡単なはずですが、検索するのに適切な用語が見つかりませんでした... C#は初めてで、Webサービスのリターンを書き込むためのシンプルなアプリを作成しようとしています。

スレッドを使用する必要があることに気づきました...スレッドにパラメーターを渡すのはかなり簡単です。Threadedメソッドから戻ってUIを更新して結果を表示する方法を見つけることができませんでした(実際には実際の結果はありません)今)

行事:

    private void TextBox_TextChanged_1(object sender, TextChangedEventArgs e)
    {
        minhaSigla = Sigla.Text;
        Task.Factory.StartNew(() => GetQuoteAndUpdateText(minhaSigla));
        tb1.Text = "UIElement-TO-UPDATE";

    }

そして、Threadedメソッド

    private string GetQuoteAndUpdateText(string sign)
    {
        string SoapEnvelope = "";
        SoapEnvelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
        SoapEnvelope += "<soap:Envelope ";
        SoapEnvelope += "xmlns:xsi = \"http://www.w3.org/2001/XMLSchema-instance\" ";
        SoapEnvelope += "xmlns:xsd= \"http://www.w3.org/2001/XMLSchema\" ";
        SoapEnvelope += "xmlns:soap= \"http://schemas.xmlsoap.org/soap/envelope/\">";
        SoapEnvelope += "<soap:Body>";
        SoapEnvelope += "   <GetQuote xmlns=\"http://www.webserviceX.NET/\"> ";
        SoapEnvelope += "       <symbol>" + sign + "</symbol> ";
        SoapEnvelope += "   </GetQuote> ";
        SoapEnvelope += "</soap:Body>";
        SoapEnvelope += "</soap:Envelope>";

        EndpointAddress endpoint = new EndpointAddress("http://www.webservicex.net/stockquote.asmx");
        BasicHttpBinding basicbinding = new BasicHttpBinding();
        basicbinding.SendTimeout = new TimeSpan(3000000000);
        basicbinding.OpenTimeout = new TimeSpan(3000000000);

        stockbyname.StockQuoteSoapClient sbn = new stockbyname.StockQuoteSoapClient(basicbinding, endpoint);

        XmlDocument xmlDocument = new XmlDocument();
        return sbn.GetQuote(SoapEnvelope);
    }

また、私のコードがどれほどひどいのかについてのコメントでさえ、どんな情報でも大いに感謝されます:P

4

3 に答える 3

4

楽しいasync/awaitのすべてに取り掛かることなく、 TaskのContinueWithメソッドを使用して、返された情報を処理できます。

private void TextBox_TextChanged_1(object sender, TextChangedEventArgs e)
{
    minhaSigla = Sigla.Text;
    var quoteGetterTask = Task.Factory.StartNew(() => GetQuoteAndUpdateText(minhaSigla));
    quoteGetterTask.ContinueWith(task => 
    {
        var theResultOfYourServiceCall = task.Result;
        //You'll need to use a dispatcher here to set the value of the text box (see below)
        tb1.Text = theResultOfYourServiceCall;     //"UIElement-TO-UPDATE";
    });
}

上記のコード サンプルで述べたように、使用している UI テクノロジによっては、ディスパッチャを使用して、不正なクロス スレッド アクセス例外が発生しないようにする必要があります。

内部の式の WinForms の例( ControlのInvokeメソッドを.ContinueWith使用)

task =>
{
    var theResultOfYourServiceCall = task.Result;
    tb1.Invoke(new Action(() => tb1.Text = theResultOfYourServiceCall));
}

内部の式の WPF の例.ContinueWith(WPF のDispatcherを使用)

task =>
{
    var theResultOfYourServiceCall = task.Result;
    tb1.Dispatcher.Invoke(DispatcherPriority.Normal, 
                          new Action(() => tb1.Text = theResultOfYourServiceCall));
}

Silverlight/Windows Phone 内の式の例.ContinueWith(Silverlight のDispatcherを使用)

task =>
{
    var theResultOfYourServiceCall = task.Result;
    tb1.Dispatcher.BeginInvoke(() => tb1.Text = theResultOfYourServiceCall);
}

Windows ストア内の式の例.ContinueWith( CoreDispatcherを使用)

task =>
{
    var theResultOfYourServiceCall = task.Result;
    tb1.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => tb1.Text = theResultOfYourServiceCall);
}
于 2013-01-22T20:07:05.847 に答える
2

より一般的には、UIスレッドでタスクが必要になります。これにより、コントロールを更新できるためです。

Task<string>.Factory.StartNew(() => GetQuoteAndUpdateText(minhaSigla)).ContinueWith(s=>  tb1.Text = s, 
TaskScheduler.FromCurrentSynchronizationContext());

ps:.net 4.5でawait&asyncを使用することもできます

于 2013-01-22T20:11:44.250 に答える
1

async/について言及した人もawaitいますが、簡単な例を次に示します。

private async void TextBox_TextChanged_1(object sender, TextChangedEventArgs e)
{
    minhaSigla = Sigla.Text;
    string result = await GetQuoteAndUpdateTextAsync(minhaSigla);
    tb1.Text = "UIElement-TO-UPDATE";
}

private Task<string> GetQuoteAndUpdateTextAsync(string sign)
{
    string SoapEnvelope = "";
    SoapEnvelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    SoapEnvelope += "<soap:Envelope ";
    SoapEnvelope += "xmlns:xsi = \"http://www.w3.org/2001/XMLSchema-instance\" ";
    SoapEnvelope += "xmlns:xsd= \"http://www.w3.org/2001/XMLSchema\" ";
    SoapEnvelope += "xmlns:soap= \"http://schemas.xmlsoap.org/soap/envelope/\">";
    SoapEnvelope += "<soap:Body>";
    SoapEnvelope += "   <GetQuote xmlns=\"http://www.webserviceX.NET/\"> ";
    SoapEnvelope += "       <symbol>" + sign + "</symbol> ";
    SoapEnvelope += "   </GetQuote> ";
    SoapEnvelope += "</soap:Body>";
    SoapEnvelope += "</soap:Envelope>";

    EndpointAddress endpoint = new EndpointAddress("http://www.webservicex.net/stockquote.asmx");
    BasicHttpBinding basicbinding = new BasicHttpBinding();
    basicbinding.SendTimeout = new TimeSpan(3000000000);
    basicbinding.OpenTimeout = new TimeSpan(3000000000);

    stockbyname.StockQuoteSoapClient sbn = new stockbyname.StockQuoteSoapClient(basicbinding, endpoint);

    XmlDocument xmlDocument = new XmlDocument();
    return sbn.GetQuoteAsync(SoapEnvelope);
}

それが既存の方法とどれほど似ているかに注意してください。それが の力ですasync

于 2013-01-22T23:54:41.473 に答える