Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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# 请帮助我使用GPS解决此线程问题_C#_Multithreading_Compact Framework_Gps_Iasyncresult - Fatal编程技术网

C# 请帮助我使用GPS解决此线程问题

C# 请帮助我使用GPS解决此线程问题,c#,multithreading,compact-framework,gps,iasyncresult,C#,Multithreading,Compact Framework,Gps,Iasyncresult,我有一个GPS类,我显然用它来获取纬度和经度 当gps状态或位置更改时,将调用UpdateData()。因此,我确保纬度和经度都有效,然后使DataReady bool等于true 因此,我以一种非常n00b的方式使用这段代码,我使用一个计时器(Windows窗体的计时器),每10秒检查一次getGPSCoordinates(),看看是否找到了有效的位置(getGPSCoordinates()不为null),如果没有,则执行其余的代码。这是使用,因为它可能需要从10秒,甚至可能是1分钟,以获得一

我有一个GPS类,我显然用它来获取纬度和经度

当gps状态或位置更改时,将调用UpdateData()。因此,我确保纬度和经度都有效,然后使DataReady bool等于true

因此,我以一种非常n00b的方式使用这段代码,我使用一个计时器(Windows窗体的计时器),每10秒检查一次getGPSCoordinates(),看看是否找到了有效的位置(getGPSCoordinates()不为null),如果没有,则执行其余的代码。这是使用,因为它可能需要从10秒,甚至可能是1分钟,以获得一个明确的gps信号

所以,虽然这很好,但我知道这不是正确的方法。我认为整个GPS业务应该在一个单独的线程上进行,它应该通知主线程位置已更改,数据已准备就绪

有人能告诉我处理这类生意的正确方法吗?我应该使用
IAsyncResult
通知主线程吗

bool DataReady = false;

private void UpdateData()
        {

            if (gps.Opened)
            {
                if (position != null)
                {

                    if (position.LatitudeValid)
                    {
                        Latitude =  position.Latitude.ToString();
                    }


                    if (position.LongitudeValid)
                    {
                        Longitude = position.Longitude.ToString();

                    }

                    if (Latitude != null && Longitude != null)
                        DataReady = true;          


                }



            }


 public string getGPSCoordinates()
        {
            if (DataReady)
            {
                return String.Format("http://maps.google.com/maps/api/staticmap?sensor=false&size=500x500&markers=color:red|label:A|{0},{1}&zoom=15&maptype=hybrid", Latitude, Longitude);
            }
            else
                return null;
        }


        }

听起来您想使用
BackgroundWorker
——但是紧凑型框架中不支持这一点。然而,这也可以通过以下方式解决:

然后,您可以在UI计时器滴答作响时调用后台工作程序(确保暂停UI计时器,直到收到响应)


如果您无法从该问题中使用已实现的
BackgroundWorker
,则需要维护一个UI和后台都可以看到的队列或列表。使用普通线程可能意味着注册回调(相当标准,使用您的
IAsyncResult
idea),但是此回调是在未知线程上运行的,任意线程-这使得更新UI有点挑剔。

听起来你想使用
BackgroundWorker
-但是这在Compact框架中本机不受支持。然而,这也可以通过以下方式解决:

然后,您可以在UI计时器滴答作响时调用后台工作程序(确保暂停UI计时器,直到收到响应)



如果您无法从该问题中使用已实现的
BackgroundWorker
,则需要维护一个UI和后台都可以看到的队列或列表。使用普通线程可能意味着注册回调(相当标准,使用您的
IAsyncResult
idea),但是此回调在未知的任意线程上运行-这使得更新您的UI有点挑剔。

除非您计划在航天飞机上使用您的应用程序,我想不出一个好的理由来烧掉这个任务中像线程一样昂贵的资源。Windows窗体计时器很好。只要你没有收到一个好的测量结果,就把间隔时间缩短到,比如说,一秒钟,这样用户就不必等待那么久。一旦你这样做了,增加间隔。尽管我怀疑这会有多大区别。

除非你打算在航天飞机上使用你的应用程序,否则我想不出一个好的理由来烧掉这项任务中像线程一样昂贵的资源。Windows窗体计时器很好。只要你没有收到一个好的测量结果,就把间隔时间缩短到,比如说,一秒钟,这样用户就不必等待那么久。一旦你这样做了,增加间隔。尽管我怀疑这会有多大区别。

当你安装了CF SDK后,你的硬盘上可能也有一个GPS演示。它使用了新的GPS中间件驱动程序,如果您不介意使用它,这是一个很好的起点。它有一个事件,表明情况发生了变化。当您移动时,它将以大约1/s的速度启动。

当您安装了CF SDK后,您的硬盘上可能还会有一个GPS演示。它使用了新的GPS中间件驱动程序,如果您不介意使用它,这是一个很好的起点。它有一个事件,表明情况发生了变化。当您移动时,它将以大约1/秒的速度启动。

此MSDN条目中实际上有一个非常类似的想法:不幸的是,.NET Framework 4支持这一点。我的目标是.NETCompactFramework3.5,当然,我没有发现这一点。但是,要将某些内容封送回特定线程,thead需要轮询队列或其他内容(想想WinForms中的消息泵)。如果您要返回UI,这是可能的。实际上,在这个MSDN条目中有一个非常类似的想法:不幸的是,.NET Framework 4支持这一点。我的目标是.NETCompactFramework3.5,当然,我没有发现这一点。但是,要将某些内容封送回特定线程,thead需要轮询队列或其他内容(想想WinForms中的消息泵)。如果您要返回UI,这是可能的。我不需要更新UI。我只需要将GPS结果转换成一个字符串,这样我就可以发送一条短信:),然后回调就可以了,但是如果用户看不到,那么就继续使用计时器实现。我不需要更新UI。我只需要将GPS结果转换成一个字符串,这样我就可以发送一条短信:),然后回调就可以了,但是如果用户看不到,那么就继续使用计时器实现。是的,我正在使用CF SDK中的GPS演示。但我的问题是,当用户在隧道或其他地方时,如果无法立即获取GPS信号,该怎么办?所以我想让它一直运行,直到收到信号:)如果你使用该事件,那么这不是问题。你的意思是我不必每隔X秒查询一次GPS信号是否已固定,位置是否已获取?IIR它已发生LocationChanged和StatusChanged事件。他们言行一致。是的,我同意。但问题是,在提供的示例中,它不断检查
position!=null
position.LatitudeValid
等。因此,这使我认为,尽管触发了LocationChanged或StatusChanged事件,但这并不一定意味着坐标已准备就绪。是的,我正在使用CF SDK中的GPS演示。但我的问题是,如果GPS信号在使用过程中无法立即获取,该怎么办