如何使用Windows Phone应用程序在UI文本框控件中连续更新数据

时间:2014-09-19 13:18:26

标签: windows-phone-8

我在Windows Phone中开发一个小型Tcp客户端套接字应用程序。实际上我有一个文本框,无论从TCP服务器收到什么数据,都应该在UI文本框控件中连续更新。

      while (val)
        {

            result = Receive();
            Dispatcher.BeginInvoke((Action)(() =>
            {
                txtOutput.Text += result;
            }));

        }

在上面的代码中,方法receive()将接收字符串数据并应在文本框控件中更新,但它没有发生,没有数据正在更新。 任何人都可以建议,我该如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

告诉你我的建议是什么,"避免使用Dispatcher,CoreDispatcher等。总有更好的解决方案。"

以下是wp8和wp8.1 WinRT应用程序的代码片段,

IProgress<object> progress = new Progress<object>(_ => UpdateTicker());
Task.Run(async () =>
{
  while (val)
  {
    progress.Report(null);
  }
});

其中UpdateTicker()方法包含您的说明,在这种情况下......

public void UpdateTicker()
{
    result = Receive();
    txtOutput.Text += result;
}

希望这会有所帮助......

答案 1 :(得分:0)

感谢所有为我的帖子做出有价值回应的人。

嗨西施, 我尝试了你的代码,但它适用于我

这是我的逻辑,用于连续更新从TCP服务器接收的数据文本框。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Navigation;
    using Microsoft.Phone.Controls;
    using Microsoft.Phone.Shell;
    using PhoneApp3.Resources;
    using System.Net.Sockets;
    using System.Threading;
    using System.Text;
    using Windows.Phone.Networking;
    using System.Threading.Tasks;


namespace PhoneApp3
{
public partial class MainPage : PhoneApplicationPage
{

    Socket _socket = null;
    static ManualResetEvent _clientDone = new ManualResetEvent(false);
    const int TIMEOUT_MILLISECONDS = 1000;
    const int MAX_BUFFER_SIZE = 2048;
    const int ECHO_PORT = 9055;  // The Echo protocol uses port 7 in this sample
    const int QOTD_PORT = 49152; // The Quote of the Day (QOTD) protocol uses port 17 in this sample
    string result = string.Empty;

    public MainPage()
    {
        InitializeComponent();
    }

    private void btnEcho_Click(object sender, RoutedEventArgs e)
    {
           SocketClient client = new SocketClient();
            Connect(txtRemoteHost.Text, ECHO_PORT);
             //close();

    }

    public void Connect(string hostName, int portNumber)
    {
        DnsEndPoint hostEntry = new DnsEndPoint(hostName, portNumber);
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
        socketEventArg.RemoteEndPoint = hostEntry;
        socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
        {
            result = e.SocketError.ToString();
            _clientDone.Set();
        });
        _clientDone.Reset();
        Thread.Sleep(2000);
        _socket.ConnectAsync(socketEventArg);
        Thread.Sleep(5000);
        _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        bool val;
        if (result == "Success")
        {
            val = true;
        }
        else
        {
            val = false;
        }


        IProgress<object> progress = new Progress<object>(_ => UpdateTicker());
        Task.Run(async () =>
        {
             while (val)
              {
                progress.Report(null);
              }
        });

    }


  public void UpdateTicker()
    {
       result = Receive();
       string[] strsplit = result.Split(' ');
       txtOutput.Text = strsplit[1];
    }

    public string Receive()
    {
        string response = "Operation Timeout";
        if (_socket != null)
        {
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
            socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
            socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
            {
                if (e.SocketError == SocketError.Success)
                {
                    // Retrieve the data from the buffer
                    response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                    response = response.Trim('\0');

                }
                else
                {
                    response = e.SocketError.ToString();
                }

                _clientDone.Set();
            });

            _clientDone.Reset();
            Thread.Sleep(1000);
           _socket.ReceiveAsync(socketEventArg);
            Thread.Sleep(1000);

            _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        }
        else
        {
            response = "Socket is not initialized";
        }

        return response;
    }
    public void Close()
    {
        if (_socket != null)
        {
            _socket.Close();
        }
    }
}

}