【问题标题】:Strange behavior of the web service which generates random vectors生成随机向量的 Web 服务的奇怪行为
【发布时间】:2014-08-08 16:14:16
【问题描述】:

有人可以解释我的程序的奇怪行为吗?

我创建了一个网络服务。它包含一个生成一组三维随机向量的方法,这些向量的正坐标和等于 1。为了生成这些向量,我使用来自here 的类RandomNess。我的代码如下:

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1
{
    [OperationContract]
    public void GenerateRandomVectors()
    {
        RandomNess.RandomNess rand = new RandomNess.RandomNess();
        var vector = new List<double>();

        for (int i = 0; i < 1000; i++)
        {      
            //The first parameter of RandFixedSum is dimension of vector;
            //The second parameter is a required sum of elements;
            //The third and the fourth parameters are bounds for elements; 
            vector = rand.RandFixedSum(3, 1, 0, 1); 

            //Writing obtained vector to a file;
            ...
        }
        return;
    }
}

我使用以下代码从 Silverlight 应用程序调用服务:

ServiceReference1.Service1Client web;
web = new ServiceReference1.Service1Client();
web.GenerateRandomVectorsAsync();

当我将结果可视化时,我看到获得的点只填充了标准单纯形的一部分。因此,该方法给出了错误的结果(参见图片here)。

但是(!)如果我直接从 Silverlight 应用程序(不是从 Web 服务)或从 Windows 窗体应用程序调用方法 RandFixedSum(...),我将获得绝对正确的分布(点填充标准单纯形的所有表面)。

我的网络服务出了什么问题?为什么会给出错误的结果?

【问题讨论】:

  • 您是否查看了该文件以验证它是否具有预期的值?写入文件的代码是什么样的?
  • 另一个想法:我看到您正在调用Async 网络方法。当您的 Silverlight 代码读取文件时,该文件是否可能尚未完成写入?
  • 不幸的是,文件写入是绝对正确的。当我阅读它时,该文件包含所有 1000 个向量。
  • ... 那么异步问题呢?
  • 当我读取文件时,写入文件已完成(它包含所有 1000 条记录)。可能是异步调用的问题,但这是什么问题?为什么异步调用会给出错误的结果?

标签: c# web-services wcf silverlight random


【解决方案1】:

您应该在调用 web.GenerateRandomVectorsAsync() 之前订阅 web.GenerateRandomVectorsCompleted 并开始解析由您的 Web 服务在事件处理程序中创建的数据文件。

【讨论】:

  • 我解决了我的问题!我发现标准函数list.Sort(...)从Web Service调用时工作不正常(当然很奇怪)。所以,我手动编写了这个函数,问题就消失了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多