Windows 8 Store Apps Learning (68) Background tasks: Control channel (Controlchannel)

Source: Internet
Author: User
Tags socket tostring

Introduced

Re-imagine Windows 8 Store Apps after a task

Control channel (Controlchannel)

Example

1, client and server to do Controlchannel communication key code

Controlchannelhelper/appcontext.cs


 * * This example uses global static variables to share information about the app and task so that background tasks can get information about the app. * 
 Note:
 * can also be achieved through Windows.ApplicationModel.Core.CoreApplication.Properties save data to implement the information sharing of app and task
 * *
    
using System.Collections.Concurrent;
Using Windows.Networking.Sockets;
    
Namespace Controlchannelhelper
{public
    class Appcontext
    {
        ///<summary>
        ///from Controlchannel received data
        ///</summary> public
        static concurrentqueue<string> MessageQueue = new Concurrentqueue<string> ();
    
        <summary>
        ///Client socket
        ///</summary> public
        static Streamsocket clientsocket;
    }
}

Controlchannelhelper/socketcontrolchannel.cs

* * Implement a Socket TCP communication controlchannel,client will receive data in real time in this controlchannel * NOTE: * WIN8 client and Socket server cannot be deployed in On the same machine, otherwise throws an exception: {The referenced object type does not support the attempted operation.
 (Exception from hresult:0x8007273d)}
* * using System;
Using System.Threading.Tasks;
Using Windows.ApplicationModel.Background;
Using Windows.foundation;
Using Windows.networking;
Using Windows.Networking.Sockets;
    
Using Windows.Storage.Streams;
        Namespace Controlchannelhelper {public class Socketcontrolchannel:idisposable {//Controlchannel
    
        Public Controlchanneltrigger Channel {get; set;}
        Client socket private Streamsocket _socket;
        Used to send data private datawriter _datawriter;
    
        Used to receive data private DataReader _datareader;
        Send heartbeat intervals to the server in minutes, min 15 minutes private uint _serverkeepaliveinterval = 15;
    
        Controlchannel Identity private String _channelid = "Mycontrolchannel";
    
  Public Socketcontrolchannel () {      Public async task<string> CreateChannel () {Dispose (); try {//instantiate a controlchannel Channel = new Controlchanneltrigger (_channelid,
            _serverkeepaliveinterval, Controlchanneltriggerresourcetype.requesthardwareslot);
                catch (Exception ex) {Dispose (); Return ' Control channel creation failed: ' + ex.
            ToString (); //Register the background task used to send heartbeat to the server socket, need to do related configuration in manifest var keepalivebuilder = new BACKGROUNDTASKB
            Uilder ();
            Keepalivebuilder.name = "Mycontrolchannelkeepalive"; Note: If the WebSocket protocol is gone, the system has built-in logic for sending a heartbeat, which is specified here directly as Windows.Networking.Sockets.WebSocketKeepAlive Keepalivebu Ilder.
            Taskentrypoint = "Backgroundtasklib.controlchannelkeepalive"; Keepalivebuilder.settrigger (Channel.keepalivetrigger); triggered when the heartbeat interval is sent, this example is 15 minutes KEEPALIVEBUILDER.REgister (); Register for the background task to display notifications to users, need to do related configuration in manifest//view more highlights in this column: Http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net
            /var pushnotifybuilder = new Backgroundtaskbuilder ();
            Pushnotifybuilder.name = "Mycontrolchannelpushnotification";
            Pushnotifybuilder.taskentrypoint = "Backgroundtasklib.controlchannelpushnotification"; Pushnotifybuilder.settrigger (Channel.pushnotificationtrigger);
    
            The Pushnotifybuilder.register () is triggered when the pushed data is received in the Controlchannel;
                try {_socket = new streamsocket ();
    
                Appcontext.clientsocket = _socket;
    
                In Controlchannel, the Streamsocket communication Channel.usingtransport (_socket) is specified; The client socket connects to the server socket await _socket.
    
                ConnectAsync (New HostName ("192.168.6.204"), "3366"); Start waiting for data pushed over Controlchannel, if WIN8 client and socket SERVer is deployed on the same machine, the exception is thrown here controlchanneltriggerstatus status = channel.waitforpushenabled (); if (status!= controlchanneltriggerstatus.hardwareslotallocated && status!= controlchanneltriggerstatus.so ftwareslotallocated) return "Control channel creation failed:" + status.
    
                ToString (); Send data to server _datawriter = new DataWriter (_socket.
                OutputStream);
                String message = "Hello" + DateTime.Now.ToString ("hh:mm:ss") + "^";
                _datawriter.writestring (message);
    
                await _datawriter.storeasync ();
            Receive data Receivedata ();
                catch (Exception ex) {Dispose (); Return ' Control channel creation failed: ' + ex.
            ToString ();
        return "OK";
    
            //start receiving this data private void Receivedata () {UINT MAXBUFFERLENGTH = 256;
       Try     {var buffer = new Windows.Storage.Streams.Buffer (maxbufferlength); var asyncoperation = _socket.
                Inputstream.readasync (buffer, maxbufferlength, inputstreamoptions.partial); asyncoperation.completed = (Iasyncoperationwithprogress<ibuffer, uint> asyncinfo, AsyncStatus AsyncStatus) = > {switch (asyncstatus) {case ASYNCST ATUs.
                                Completed:case AsyncStatus.Error:try {
                                Ibuffer bufferread = Asyncinfo.getresults ();
                                UINT bytesread = bufferread.length;
    
                                _datareader = Datareader.frombuffer (Bufferread);
                            The data received the completion of receivecompleted (Bytesread); catch (Exception Ex) {AppContext.MessageQueue.Enqueue (ex.
                            ToString ());
                        } break;
                            Case AsyncStatus.Canceled:AppContext.MessageQueue.Enqueue ("canceled when receiving data");
                    Break
            }
                }; The catch (Exception ex) {AppContext.MessageQueue.Enqueue (ex).
            ToString ());  } public void receivecompleted (UINT bytesread) {//Get the data received this time uint
            Bufferlength = _datareader.unconsumedbufferlength;
    
            String message = _datareader.readstring (bufferlength);
    
            The received data is put into memory, which is handled by Pushnotificationtrigger triggered by the background (and can also be processed here) AppContext.MessageQueue.Enqueue (message);
        Start receiving next data receivedata (); }//Free resources public void Dispose () {lock (this) {if (_datawriter!= null) {
                        try {_datawriter.detachstream ();
                    _datawriter = null;
    
                \ catch (Exception ex) {}}
                        if (_datareader!= null) {try {
                        _datareader.detachstream ();
                    _datareader = null;
    
                catch (Exception exp) {}} if (_socket!= null) {_socket.
                    Dispose ();
                _socket = null;
                    } if (Channel!= null) {channel.dispose (); CHannel = null; }
            }
        }
    }
}

2. Service End

Backgroundtasklib/controlchannelkeepalive.cs

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.