Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows Phone 8.1中的后台线程_C#_.net_Multithreading_Windows Phone 8.1 - Fatal编程技术网

C# Windows Phone 8.1中的后台线程

C# Windows Phone 8.1中的后台线程,c#,.net,multithreading,windows-phone-8.1,C#,.net,Multithreading,Windows Phone 8.1,我正在开发一个WindowsPhone8.1应用程序,我想在后台运行一个while循环(可能很长时间)。我在这里和其他地方读过几篇论坛帖子,但没有一篇真正像我想做的那样。我的想法是使用StreamSocket连接到服务器,服务器发送未知数量的guid(可能是2个,可能是1000个)。当服务器发送一个特殊的while循环(例如,全零)时,我希望中断while循环,但可能还有其他条件会停止while循环。由于良好的旧System.Threading.Thread不可用,因此我需要其他方法来完成此操作

我正在开发一个WindowsPhone8.1应用程序,我想在后台运行一个while循环(可能很长时间)。我在这里和其他地方读过几篇论坛帖子,但没有一篇真正像我想做的那样。我的想法是使用
StreamSocket
连接到服务器,服务器发送未知数量的guid(可能是2个,可能是1000个)。当服务器发送一个特殊的while循环(例如,全零)时,我希望中断while循环,但可能还有其他条件会停止while循环。由于良好的旧
System.Threading.Thread
不可用,因此我需要其他方法来完成此操作

我在网上看过这篇文章。此帖子链接如下:。在“最佳实践”下,微软说不要在线程池上运行的任何东西上使用
async/await
,这会使事情进一步复杂化

我认为有两种可能的解决办法:

  • 使用其他方法创建线程,支持
    async/await
  • 使用线程池并使用阻塞调用从服务器接收数据,而不使用
    async/await

也许还有别的办法,但我已经做了一整天了,所以我的大脑可能已经崩溃了。。。不过先谢谢你

您可以使用
System.Threading.Tasks.Task
保持从
IInputStream
读取,而无需使用无限循环:

private async void Foo()
{
    StreamSocket streamSocket = new StreamSocket();
    await streamSocket.ConnectAsync(new HostName("localhost"), "8888");

    IBuffer buffer = new Windows.Storage.Streams.Buffer(16);
    IInputStream inputStream = streamSocket.InputStream;

    Task<IBuffer> readTask = inputStream.ReadAsync(
        buffer,
        buffer.Capacity,
        InputStreamOptions.None).AsTask();
    var notAwait = readTask.ContinueWith(ReadMore, streamSocket);
}

private void ReadMore(Task<IBuffer> task, object state)
{
    StreamSocket streamSocket = state as StreamSocket;

    if (task.Status != TaskStatus.RanToCompletion)
    {
        // TODO: Handle error.
        return;
    }

    IBuffer buffer = task.Result;
    Guid guid = new Guid(buffer.ToArray());
    Debug.WriteLine(guid);

    if (guid == Guid.Empty)
    {
        // Close socket and stop reading.
        streamSocket.Dispose();

        return;
    }

    IInputStream inputStream = streamSocket.InputStream;

    Task<IBuffer> readTask = inputStream.ReadAsync(
        buffer,
        buffer.Capacity,
        InputStreamOptions.None).AsTask();
    var notAwait = readTask.ContinueWith(ReadMore, streamSocket);
}
private异步void Foo()
{
StreamSocket StreamSocket=新的StreamSocket();
等待streamSocket.ConnectAsync(新主机名(“localhost”),“8888”);
IBuffer buffer=新的Windows.Storage.Streams.buffer(16);
IIInputStream inputStream=streamSocket.inputStream;
Task readTask=inputStream.ReadAsync(
缓冲器
缓冲区,容量,
InputStreamOptions.None).AsTask();
var notAwait=readTask.ContinueWith(ReadMore,streamSocket);
}
私有void ReadMore(任务、对象状态)
{
StreamSocket StreamSocket=状态为StreamSocket;
if(task.Status!=TaskStatus.RanToCompletion)
{
//TODO:处理错误。
返回;
}
IBuffer buffer=task.Result;
Guid=新Guid(buffer.ToArray());
Debug.WriteLine(guid);
if(guid==guid.Empty)
{
//关闭插座并停止读取。
streamSocket.Dispose();
返回;
}
IIInputStream inputStream=streamSocket.inputStream;
Task readTask=inputStream.ReadAsync(
缓冲器
缓冲区,容量,
InputStreamOptions.None).AsTask();
var notAwait=readTask.ContinueWith(ReadMore,streamSocket);
}

我认为以这种方式使用while循环将占用大量资源。您认为它在哪里谈到不在线程池中使用async/await?在“不要”部分中,我看到的唯一一件事是“不要尝试创建使用async关键字的工作项处理程序。这可能会导致意外行为。”这是指使用
async void
函数。每个guid应为16个字节。你看到了什么症状?你能分享一些NETMON跟踪吗?您可以在服务器端捕获跟踪。