日期:2014-05-20  浏览次数:20712 次

■■■有高手吗,我这问题问了四回了,还没答案
静态变量应该知道吧,各个类都能访问,就是调用DLL,其它的DLL也能访问,但静态变量在整个系统运行中,是唯一的,而我现在急需要一种功能和静态变量类拟,但是在一个线程中唯一的,即不影响其它的线程,但又需要各个类都能直接读取,修改的变量。
如果.NET真的没有提供这种功能,不知道有没有什么变通的方法。

这个功能主要是用户游戏服务器端,刚试着开发个游戏,就碰到这个问题。

------解决方案--------------------
没太明白...

怎么一会又唯一,一会又是只在一个线程中是唯一..
------解决方案--------------------
1。你说的有点不对,static变量只能说是在一个进程里面是唯一的。比如我有两个exe,调用相同dll,里面的static也是2份,除非开数据共享。
2。没有完全明白你的意思,如果要在一个线程中唯一,作个线程类,把变量放入,那么他就属于各自的线程了。

class threadClass{ int a;public void StartThread(){...}}//a就是每个线程一份

....
threadClass tc;
Thread t = new Thread(new ThreadStart(tc.StartThread());
tc.start();
------解决方案--------------------
要不用session或者cookie来做吧
------解决方案--------------------
我在楼主的另一个贴子里看,是不是多线程同步的问题啊?
------解决方案--------------------
你说的在线程中唯一,的话就做个类包装线程,你说的有矛盾,既要唯一又要能够在各个类中访问,根本做不到
------解决方案--------------------
那就用private static不行吗?
------解决方案--------------------
楼主是不是开发Session哦?看看别人的思想把。多数服务器用Session池解决的。类似于Web服务器的Session池。
------解决方案--------------------
楼主,这个是思想好不好。堆栈也是Session,ArrayList也是Session,主要看你怎么看待这个问题。

我以前做过通讯的例子,一般是用Hashtable来保留客户端的某些信息的。你也可以参考这个方法来实现
------解决方案--------------------
如果你用的是Socket机制,应该是Socket的引用。

如果是Cookie机制的,应该有客户端的Cookie(Cookie不一定用于Web,应用程序也可以)

关键是这句话:你怎么证明我就是刚才来的那个人。
------解决方案--------------------
你可以把你的问题代码发给我,让我帮你看一下;
liangxfmail@gmail.com
------解决方案--------------------
用一个单键模式不就可以了?
------解决方案--------------------
我想只要创建该非静态类的一个静态变量(该类的静态变量)就OK了,所有其他类要访问该类的时候只访问该类的静态实例对象就保持了唯一了
------解决方案--------------------
不明白的话可发站内消息给我
------解决方案--------------------
用ThreadStatic来标识变量,即可实现不同线程变量不共享
------解决方案--------------------
给你写了一个用ThreadStatic标识的例子,先看看,不明白的话,QQ:830390
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 2; i++)
{
Worker worker = new Worker();
worker.name = "Thread " + i;
Thread t = new Thread(new ThreadStart(worker.Start));
t.IsBackground = true;
t.Start();
}
Console.ReadLine();
}
}

public class Worker
{
[ThreadStatic]
public static int count = 0;

public string name = " ";

public void Start()
{
while (true)
{
Console.WriteLine( "Thread Name: " + name + " Count: " + count);
count++;
Thread.Sleep(1000);