来自另一个线程的异步 TCP 数据不安全。跨线程操作

发布于 2024-11-07 01:27:07 字数 857 浏览 1 评论 0原文

我有两个类库。一个是普通的 .NET 程序集,另一个是链接桌面类文件的 Compact Framework 设备程序集。该库负责服务器和客户端之间的 TCP 异步操作。

现在,我为服务器创建一个 Windows 项目,并为客户端创建一个 Windows Mobile Forms 设备项目。

我在客户端和服务器接收的数据上使用了一些事件。为了触发来自 ASync 通过 TCP 安全接收的数据的数据,我使用 Control 类虚拟来检查是否需要 Invoke。

奇怪的是,当从服务器向设备 CF 客户端发送数据时,数据不需要对需要显示数据的控件进行任何线程处理。 但是从客户端向服务器发送数据时出现跨线程操作异常。

这是一些代码。

我用来保护数据的静态方法。

public static void InvokeIfNecessary(Control control, Action setValue)
{
    if (control.InvokeRequired)
    {
        control.Invoke(setValue);
    }
    else
    {
        setValue();
    }
}

当我想抛出来自TCP通信的数据时。

    if (OnClientChangeConnection != null) SafeData.InvokeIfNecessary(_helpControl, () => OnClientChangeConnection(ConnectedClients, requestClientInfo));

知道为什么我会出现这种行为吗?或者有更好的方法处理这个问题吗?

谢谢你!

I have two class libraries. One is a normal .NET assembly and the other is a Compact Framework device assembly linkings the desktop class files. This library is responsible on TCP Async operations between a server and client.

Now i create a Windows project for the server and a Windows Mobile Forms device project as a client.

I use some events on Data Received for the client and the server. To fire the data came from the ASync received data through TCP safe I use a Control class dummy to check if Invoke is required.

The strange thing is that when sending data from server to a device CF client the data not need any thread handling for the controls where you need to show the data.
But sending data from a client to a server I get cross thread operation exception.

Here is some code.

The static method i use to safe the data.

public static void InvokeIfNecessary(Control control, Action setValue)
{
    if (control.InvokeRequired)
    {
        control.Invoke(setValue);
    }
    else
    {
        setValue();
    }
}

When I want to throw data came from the TCP communication.

    if (OnClientChangeConnection != null) SafeData.InvokeIfNecessary(_helpControl, () => OnClientChangeConnection(ConnectedClients, requestClientInfo));

Any idea why I get this behavior? Or any better handling this problem ?

Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雾里花 2024-11-14 01:27:07

由于您正在定义 InvokeIfNecessary,请注意“如果需要”部分。这意味着请求可能来自调度程序的不同线程。请注意,我说“可能”——这意味着它可能不会,因此可能来自调度员。

完整框架和紧凑框架可以不同地使用线程来处理异步操作。例如,紧凑框架可能是单线程的(因为它在移动设备上运行),而服务器完整框架可能是多线程的。 API 看起来相同,但数据可能来自不同的线程。

Silverlight 就是一个很好的例子,它使用调度程序线程(即主 UI 线程)来执行网络访问等操作,即使您使用的是 BeginXXX/EndXXX 异步调用。因此,如果您在此移动环境上运行简单的代码,您不会遇到线程异常,但您肯定可能在服务器上遇到一个异常,其中 BeginXXX/EndXXX 调用可能会转到不同的线程 - - 同样,他们可能不会,这实际上取决于服务器在调用时的决定。

因此,您总是需要查明请求是否可能来自不同的线程。使用像 InvokeIfNecessary 这样的东西是一种必要的罪恶,也是正确的做法——不要仅仅因为在某些环境中你看不到问题而忽略它。

Since you are defining InvokeIfNecessary, notice the "if necessary" part. This means that the request may come in on a different thread from the dispatcher. Notice I say "may" -- which means that it may not, and so may come from the dispatcher.

The full framework and the compact framework may use threading differently to handle async operations. For example, the compact framework may be single-threaded (since it runs on Mobile) while the server full framework may be multi-threaded. The API looks the same, but data may come in from different threads.

One good example is Silverlight, which uses the dispatcher thread (i.e. the main UI thread) to do network access and stuff, even though you are using the BeginXXX/EndXXX async calls. Therefore, if you run simplistic code on this mobile environment, you won't get a thread exception, but you definitely may get one on the server, where the BeginXXX/EndXXX calls may go to different threads -- again they may not, and it really depends on the server's decision at the time of the call.

Therefore, you always need to find out whether a request may come from a different thread. Using something like your InvokeIfNecessary is a necessary evil and is the right thing to do -- don't omit it just because in some environments you don't see the problem.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文