C# Windows Phone 8.1中的后台线程
我正在开发一个WindowsPhone8.1应用程序,我想在后台运行一个while循环(可能很长时间)。我在这里和其他地方读过几篇论坛帖子,但没有一篇真正像我想做的那样。我的想法是使用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不可用,因此我需要其他方法来完成此操作
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跟踪吗?您可以在服务器端捕获跟踪。